hdu 2688 Rotate

来源:互联网 发布:mac软件开发工具 编辑:程序博客网 时间:2024/05/21 10:12

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;}


原创粉丝点击