http://acm.hdu.edu.cn/showproblem.php?pid=2688
这个题目看起来挺吓人的,但是注意到[S E] (abs(E-S)<=1000),非常的小就是我们的突破口了……开始用树状数组求出数组总的ans,然后循环的时候直接模拟就可以了并且维护这个ans就行了……还好这个题目询问的时候中是询问整个区间的ans,不然真不会了,囧……
这个题用c++交好,g++很容易超时的样子
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
#define lowbit(x) x&(-x)
const int maxn=10010;
int d[maxn],a[3000100];
void add(int pos)
{
for(;pos<=10000;pos+=lowbit(pos))
d[pos]++;
}
int query(int pos)
{
int sum=0;
for(;pos>=1;pos-=lowbit(pos))
sum+=d[pos];
return sum;
}
int main()
{
int n,m,l,r;
long long ans;
while(scanf("%d",&n)==1)
{
memset(d,0,sizeof(d));
ans=0;
for(int i=0;i<n;i++)
{
scanf("%d",&a[i]);
ans+=query(a[i]-1);
add(a[i]);
}
char ord[5];
scanf("%d",&m);
while(m--)
{
scanf("%s",ord);
if(ord[0]=='Q') printf("%I64d\n",ans);
else
{
scanf("%d%d",&l,&r);
int tmp=a[l],cnt1=0,cnt2=0;
for(int i=l+1;i<=r;i++)
{
if(a[i]>tmp) cnt1++;
else if(a[i]<tmp) cnt2++;
a[i-1]=a[i];
}
a[r]=tmp;
ans+=(cnt2-cnt1);
}
}
}
return 0;
}