这题,因为要统计之前有多少个数比当前的数小,所以我用的树状数组
基本代码就是这样,还是比较好想的,只不过我没想出来罢了
#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 ",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); }