hdu 2688

时间:2022-01-10 09:31:50

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

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

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
using namespace std;
int n,m;
const int maxn = ;
int c[]; //纪录每个值之前有多少个小于她的数
int ans[];
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=; memset(c, , sizeof(c));
memset(ans, , sizeof(ans));
for(i=;i<=n;++i)
{
scanf("%d",ans+i);
add(ans[i]);
val += sum(ans[i]-);
}
scanf("%d",&m);
for(i=;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+];
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=;
while(pos>)
{
su+=c[pos];
pos-=lowbit(pos);
}
return su;
}
int lowbit(int k)
{
return k&(-k);
}