将序列分成$\sqrt{n}$块,预处理出每两块之间的逆序对数,以及ap[i]表示前i块内数字出现次数的树状数组

预处理:$O(n\sqrt{n}\log n)$

修改时,ap[i]可以在$O(\sqrt{n}\log n)$复杂度内完成修改,然后考虑修改的位置对答案的贡献,可以发现相当于某一行、某一列都加上一个数,对于行列各开$\sqrt{n}$棵树状数组差分维护

修改:$O(\sqrt{n}\log n)$

查询时中间那块可以通过树状数组$O(\log n)$求出,然后向两边暴力扩展

查询:$O(\sqrt{n}\log n)$

  1. #include<cstdio>
  2. const int N=50010,K=230;
  3. int n,m,op,l,r,i,j,k,size,block,a[N],pos[N],st[K],en[K],ans[K][K],T,x,y,z,now,all,last,tmp[K][2],ap[K][N],tag[2][K][K],bit[N],vis[N];
  4. inline void read(int&a){char ch;while(!(((ch=getchar())>='0')&&(ch<='9')));a=ch-'0';while(((ch=getchar())>='0')&&(ch<='9'))(a*=10)+=ch-'0';}
  5. inline void add(int x){for(;x<=n;x+=x&-x)if(vis[x]!=T)vis[x]=T,bit[x]=1;else bit[x]++;}
  6. inline int sum(int x){int t=0;for(;x;x-=x&-x)if(vis[x]==T)t+=bit[x];return t;}
  7. inline void add(int p,int x,int y){for(;x<=n;x+=x&-x)ap[p][x]+=y;}
  8. inline int sum(int p,int x){if(!p)return 0;int t=0;for(;x;x-=x&-x)t+=ap[p][x];return t;}
  9. inline void add(int w,int p,int x,int y){for(;x<=block;x+=x&-x)tag[w][p][x]+=y;}
  10. inline int sum(int w,int p,int x){int t=0;for(;x;x-=x&-x)t+=tag[w][p][x];return t;}
  11. inline void change(int x,int y){
  12. z=a[x];
  13. for(i=k=pos[x];i<=block;i++)add(i,z,-1),add(i,y,1);
  14. now=sum(k-1,z)-sum(k-1,y)+sum(k,z-1)-sum(k,y-1);
  15. for(i=st[k];i<x;i++){
  16. if(a[i]>z)now--;
  17. if(a[i]>y)now++;
  18. }
  19. for(i=en[k];i>x;i--){
  20. if(a[i]<z)now--;
  21. if(a[i]<y)now++;
  22. }
  23. for(i=1;i<=block;i++)tmp[i][0]=sum(i-1,y)-sum(i-1,z),tmp[i][1]=sum(i,y-1)-sum(i,z-1);
  24. for(i=k;i;i--)add(0,i,k,now+tmp[i][0]);
  25. for(i=k;i<=block;i++)add(1,i,1,tmp[i][1]),add(1,i,k+1,-tmp[i][1]);
  26. a[x]=y;
  27. }
  28. inline int ask(int l,int r){
  29. T++,x=pos[l],y=pos[r];
  30. if(x==y){
  31. now=0;
  32. for(;r>=l;r--)now+=sum(a[r]-1),add(a[r]);
  33. return now;
  34. }
  35. now=ans[x+1][y-1]+sum(0,x+1,y-1)+sum(1,y-1,x+1),all=st[y]-en[x]-1;
  36. for(i=st[y];i<=r;i++)now+=all-sum(a[i])-sum(y-1,a[i])+sum(x,a[i]),add(a[i]),all++;
  37. for(i=en[x];i>=l;i--)now+=sum(a[i]-1)+sum(y-1,a[i]-1)-sum(x,a[i]-1),add(a[i]);
  38. return now;
  39. }
  40. int main(){
  41. read(n);
  42. for(i=1;i<=n;i++)read(a[i]);
  43. for(;size*size<n;size++);
  44. for(i=1;i<=n;i++)pos[i]=(i-1)/size+1;
  45. for(block=pos[n],i=1;i<=block;i++)st[i]=size*(i-1)+1;
  46. for(en[block]=n,i=block-1;i;i--)en[i]=st[i+1]-1;
  47. for(i=1;i<=block;i++){
  48. now=all=0,T++;
  49. for(j=1;j<=n;j++)ap[i][j]=ap[i-1][j];
  50. for(j=st[i];j<=en[i];j++)add(i,a[j],1);
  51. for(j=i;j<=block;ans[i][j++]=now)for(k=st[j];k<=en[j];k++)now+=all-sum(a[k]),add(a[k]),all++;
  52. }
  53. read(m);
  54. while(m--){
  55. read(op),read(l),read(r),l^=last,r^=last;
  56. if(!op)printf("%d\n",last=ask(l,r));else change(l,r);
  57. }
  58. return 0;
  59. }

  

BZOJ3787 : Gty的文艺妹子序列的更多相关文章

  1. BZOJ3787:Gty的文艺妹子序列(分块,树状数组)

    Description Autumn终于会求区间逆序对了!Bakser神犇决定再考验一下他,他说道: “在Gty的妹子序列里,某个妹子的美丽度可也是会变化的呢.你还能求出某个区间中妹子们美丽度的逆序对 ...

  2. BZOJ3787 gty的文艺妹子序列 【树状数组】【分块】

    题目分析: 首先这种乱七八糟的题目就分块.然后考虑逆序对的统计. 一是块内的,二是块之间的,三是一个块内一个块外,四是都在块外. 令分块大小为$S$. 块内的容易维护,单次维护时间是$O(S)$. 块 ...

  3. 【分块】【树状数组】bzoj3787 Gty的文艺妹子序列

    题解懒得自己写了,Orz一发wangxz神犇的: http://bakser.gitcafe.com/2014/12/04/bzoj3787-Gty%E7%9A%84%E6%96%87%E8%89%B ...

  4. BZOJ 3787: Gty的文艺妹子序列

    3787: Gty的文艺妹子序列 Time Limit: 50 Sec  Memory Limit: 256 MBSubmit: 186  Solved: 58[Submit][Status][Dis ...

  5. BZOJ 3787: Gty的文艺妹子序列 [分块 树状数组!]

    传送门 题意:单点修改,询问区间内逆序对数,强制在线 看到加了!就说明花了不少时间.... 如果和上题一样预处理信息,用$f[i][j]$表示块i到j的逆序对数 强行修改的话,每个修改最多会修改$(\ ...

  6. BZOJ 3787 Gty的文艺妹子序列(分块+树状数组+前缀和)

    题意 给出n个数,要求支持单点修改和区间逆序对,强制在线. n,m<=50000 题解 和不带修改差不多,预处理出smaller[i][j]代表前i块小于j的数的数量,但不能用f[i][j]代表 ...

  7. BZOJ 3809: Gty的二逼妹子序列

    3809: Gty的二逼妹子序列 Time Limit: 80 Sec  Memory Limit: 28 MBSubmit: 1387  Solved: 400[Submit][Status][Di ...

  8. 【BZOJ-3809】Gty的二逼妹子序列 分块 + 莫队算法

    3809: Gty的二逼妹子序列 Time Limit: 80 Sec  Memory Limit: 28 MBSubmit: 1072  Solved: 292[Submit][Status][Di ...

  9. BZOJ3809: Gty的二逼妹子序列

    Description Autumn和Bakser又在研究Gty的妹子序列了!但他们遇到了一个难题.   对于一段妹子们,他们想让你帮忙求出这之内美丽度∈[a,b]的妹子的美丽度的种类数.   为了方 ...

随机推荐

  1. ruby Errors & Exceptions

    When you first started coding, errors were probably the last thing you wanted to see. After all, it’ ...

  2. ruby开发过程中的小总结

    (1)建表的时候注意保留字 在新建的表里无法插入一列的值, 报错信息是:Can't mass-assign protected attributes,这一列的列名是type,查了一下发现是因为type ...

  3. ubuntu同步系统时间命令

      *设置时区的命令 sudo tzselect 然后一步步选择就行 *同步时间的命令 sudo ntpdate ntp.ubuntu.com

  4. 使用豆瓣的pypi源

    配置文件位置: 1.linux ~/.pip/pip.conf 2.windows %HOME%\pip\pip.ini 配置文件内容:[global] index-url = http://pypi ...

  5. MVC 详细说明

    .NET MVC执行过程: 1.网址路由比对 2.执行Controller与Action 3.执行View并返回结果 在使用MVC中是由IgnoreRoute()辅助方法对比成功的,会导致程序直接跳离 ...

  6. JavaScript toFixed()使用的注意事项

    以下是w3school的定义: 定义和用法 toFixed() 方法可把 Number 四舍五入为指定小数位数的数字. 语法 NumberObject.toFixed(num) 参数 描述 num 必 ...

  7. iOS的 context 和Android 中的 canvas

    ios 想要绘图,要用到CGContextRef类.最基本的用法是在- (void)drawRect:(CGRect)rect 函数中绘制. Android 中要用到Canvas类.最基本的用法是在  ...

  8. 解决虚拟机 正在决定eht0 的ip信息失败 无链接-- 添加虚拟网卡

    添加步骤:1.进入设备管理器 2.点下一步3.继续下一步 4.继续往下走

  9. TokuDB的特点验证

    随着数据量越来越大,越来越频繁的遇到需要进行结构拆分的情况,每一次拆分都耗时很久,并且需要多方配合,非常的不想搞这个事情.于是在@zolker的提醒下想到了13年开源tokuDB,来解决我们迫在眉睫的 ...

  10. Java for LeetCode 172 Factorial Trailing Zeroes

    Given an integer n, return the number of trailing zeroes in n!. Note: Your solution should be in log ...