mltang

博客园 首页 新随笔 联系 订阅 管理

这题,因为要统计之前有多少个数比当前的数小,所以我用的树状数组

基本代码就是这样,还是比较好想的,只不过我没想出来罢了

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
using namespace std;
int n,m;
const int maxn = 10005;
int c[10005]; //纪录每个值之前有多少个小于她的数
int ans[3000005];
int lowbit(int k);
void add(int pos);
int sum(int pos);
int main()
{
    int i,j,k;
    while(scanf("%d",&n) != EOF)
    {
        long long val=0;
        
        memset(c, 0, sizeof(c));
        memset(ans, 0, sizeof(ans));
        for(i=1;i<=n;++i)
        {
            scanf("%d",ans+i);
            add(ans[i]);
            val += sum(ans[i]-1);
        }
        scanf("%d",&m);
        for(i=0;i<m;++i)
        {
            char c;
            getchar();
            scanf("%c",&c);
            if(c == 'Q')
                printf("%lld\n",val);
            else
            {
                int x,y;
                scanf("%d%d",&x,&y);
//                x++,y++;
                int temp = ans[x];
                for(j=x;j<y;++j)
                {
                    ans[j]=ans[j+1];
                    if(ans[j]>temp) val --;
                    if(ans[j]<temp) val ++;
                }
                ans[y] = temp;
            }
        }
    }
}
void add(int pos)
{
    while(pos<maxn)
    {
        c[pos] ++;
        pos += lowbit(pos);
    }
}
int sum(int pos)
{
    int su=0;
    while(pos>0)
    {
        su+=c[pos];
        pos-=lowbit(pos);
    }
    return su;
}
int lowbit(int k)
{
    return k&(-k);
}

 

posted on 2018-04-23 01:12  mltang  阅读(101)  评论(0编辑  收藏  举报