hdu 2688 树状数组求 序列对

R表示k1--k2依次向左循环1位 Q:查询多少升序序列

  1. #include <cstdio>  
  2. #include <cstring>  
  3. using namespace std;  
  4. #define maxn 3000005  
  5. int arr[10005],a[maxn];  
  6. int lowbit(int x)  
  7. {  
  8.     return x&(-x);  
  9. }  
  10. void update(int x,int val) 
  11. {  
  12.     while(x<10001)  
  13.     {  
  14.         arr[x]+=val;  
  15.         x+=lowbit(x);  
  16.     }  
  17. }  
  18. int getsum(int x) 
  19. {  
  20.     int ans=0;  
  21.     while(x>0)  
  22.     {  
  23.         ans+=arr[x];  
  24.         x-=lowbit(x);  
  25.     }  
  26.     return ans;  
  27. }  
  28. int main()  
  29. {  
  30.     __int64 ans;  
  31.     int i,j,n,m,x,y;  
  32.     char c;  
  33.     while(scanf("%d",&n)!=EOF)  
  34.     {  
  35.         ans=0;  
  36.         memset(arr,0,sizeof(arr));  
  37.         memset(a,0,sizeof(a));  
  38.         for(i=1;i<=n;i++)  
  39.         {  
  40.             scanf("%d",&a[i]);  
  41.             update(a[i],1);  
  42.             ans+=getsum(a[i]-1);  
  43.         }  
  44.         scanf("%d",&m);  
  45.         while(m--)  
  46.         {  
  47.             getchar();  
  48.             scanf("%c",&c);  
  49.             if(c=='Q') printf("%I64d\n",ans);  
  50.             if(c=='R')  
  51.             {  
  52.                 scanf("%d%d",&x,&y);  
  53.                 x++;y++;   
  54.                 int temp=a[x];  
  55.                 for(i=x;i<y;i++)  
  56.                 {  
  57.                     a[i]=a[i+1];  
  58.                     if(a[i]>temp) ans--;    
  59.                     if(a[i]<temp) ans++;  
  60.                 }  
  61.                 a[y]=temp;  
  62.             }  
  63.         }  
  64.     }  
  65.     return 0;  
  66. }  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值