思路:

a[i]

  1. //By SiriusRen
  2. #include <cmath>
  3. #include <cstdio>
  4. #include <cstring>
  5. #include <algorithm>
  6. using namespace std;
  7. const int N=20050;
  8. int n,m,cpy[N],h[N],u,Block,block[N],xx,yy,ans;
  9. struct BIT{
  10. int tree[N*4];
  11. void insert(int l,int r,int pos,int X,int f){
  12. if(l==r){tree[pos]+=f;return;}
  13. int mid=(l+r)>>1,lson=pos<<1,rson=pos<<1|1;
  14. if(mid<X)insert(mid+1,r,rson,X,f);
  15. else insert(l,mid,lson,X,f);
  16. tree[pos]=tree[lson]+tree[rson];
  17. }
  18. int query(int l,int r,int pos,int L,int R){
  19. if(L>R)return 0;
  20. if(l>=L&&r<=R){return tree[pos];}
  21. int mid=(l+r)>>1,lson=pos<<1,rson=pos<<1|1;
  22. if(mid<L)return query(mid+1,r,rson,L,R);
  23. else if(mid>=R)return query(l,mid,lson,L,R);
  24. else return query(l,mid,lson,L,R)+query(mid+1,r,rson,L,R);
  25. }
  26. }bit[222];
  27. int main(){
  28. scanf("%d",&n),Block=sqrt(n);
  29. for(int i=1;i<=n;i++)scanf("%d",&h[i]),cpy[i]=h[i],block[i]=(i-1)/Block+1;
  30. sort(cpy+1,cpy+1+n),u=unique(cpy+1,cpy+1+n)-cpy-1;
  31. for(int i=1;i<=n;i++)h[i]=lower_bound(cpy+1,cpy+1+u,h[i])-cpy;
  32. for(int i=1;i<=n;i++){
  33. bit[0].insert(1,u,1,h[i],1);
  34. ans+=bit[0].query(1,u,1,h[i]+1,u);
  35. bit[block[i]].insert(1,u,1,h[i],1);
  36. }
  37. printf("%d\n",ans);
  38. scanf("%d",&m);
  39. while(m--){
  40. scanf("%d%d",&xx,&yy);
  41. if(xx>yy)swap(xx,yy);
  42. if(block[xx]+1<block[yy]){
  43. for(int i=block[xx]+1;i<block[yy];i++){
  44. ans-=bit[i].query(1,u,1,1,h[xx]-1);
  45. ans+=bit[i].query(1,u,1,h[xx]+1,u);
  46. ans+=bit[i].query(1,u,1,1,h[yy]-1);
  47. ans-=bit[i].query(1,u,1,h[yy]+1,u);
  48. }
  49. int temp=lower_bound(block+1,block+1+n,block[xx]+1)-block;
  50. for(int i=xx+1;i<temp;i++){
  51. if(h[i]<h[xx])ans--;
  52. else if(h[i]>h[xx])ans++;
  53. if(h[i]<h[yy])ans++;
  54. else if(h[i]>h[yy])ans--;
  55. }
  56. temp=lower_bound(block+1,block+1+n,block[yy])-block;
  57. for(int i=temp;i<yy;i++){
  58. if(h[i]<h[xx])ans--;
  59. else if(h[i]>h[xx])ans++;
  60. if(h[i]<h[yy])ans++;
  61. else if(h[i]>h[yy])ans--;
  62. }
  63. }
  64. else{
  65. for(int i=xx+1;i<yy;i++){
  66. if(h[i]<h[xx])ans--;
  67. else if(h[i]>h[xx])ans++;
  68. if(h[i]<h[yy])ans++;
  69. else if(h[i]>h[yy])ans--;
  70. }
  71. }
  72. if(h[xx]<h[yy])ans++;
  73. else if(h[xx]>h[yy])ans--;
  74. bit[block[xx]].insert(1,u,1,h[xx],-1),bit[block[yy]].insert(1,u,1,h[yy],-1);
  75. bit[block[xx]].insert(1,u,1,h[yy],1),bit[block[yy]].insert(1,u,1,h[xx],1);
  76. swap(h[xx],h[yy]);
  77. printf("%d\n",ans);
  78. }
  79. }

BZOJ 2141 分块 线段树的更多相关文章

  1. BZOJ - 2957 (分块/线段树)

    题目链接 本质是维护斜率递增序列. 用分块的方法就是把序列分成sqrt(n)块,每个块分别用一个vector维护递增序列.查询的时候遍历所有的块,同时维护当前最大斜率,二分找到每个块中比当前最大斜率大 ...

  2. BZOJ.4184.shallot(线段树分治 线性基)

    BZOJ 裸的线段树分治+线性基,就是跑的巨慢_(:з」∠)_ . 不知道他们都写的什么=-= //41652kb 11920ms #include <map> #include < ...

  3. [BZOJ 4025]二分图(线段树分治+带边权并查集)

    [BZOJ 4025]二分图(线段树分治+带边权并查集) 题面 给出一个n个点m条边的图,每条边会在时间s到t出现,问每个时间的图是否为一个二分图 \(n,m,\max(t_i) \leq 10^5\ ...

  4. bzoj 3585 mex - 线段树 - 分块 - 莫队算法

    Description 有一个长度为n的数组{a1,a2,...,an}.m次询问,每次询问一个区间内最小没有出现过的自然数. Input 第一行n,m. 第二行为n个数. 从第三行开始,每行一个询问 ...

  5. BZOJ5286 HNOI/AHOI2018转盘(分块/线段树)

    显然最优走法是先一直停在初始位置然后一次性走完一圈.将序列倍长后,相当于找一个长度为n的区间[l,l+n),使其中ti+l+n-1-i的最大值最小.容易发现ti-i>ti+n-(i+n),所以也 ...

  6. CDOJ 1157 数列(seq) 分块+线段树

    数列(seq) Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.uestc.edu.cn/#/problem/show/1157 Desc ...

  7. 【BZOJ 3476】 线段树===

    59  懒惰的奶牛贝西所在的牧场,散落着 N 堆牧草,其中第 i 堆牧草在 ( Xi,Yi ) 的位置,数量有 Ai 个单位.贝西从家移动到某一堆牧草的时候,只能沿坐标轴朝正北.正东.正西.正南这四个 ...

  8. BZOJ 4025: 二分图 [线段树CDQ分治 并查集]

    4025: 二分图 题意:加入边,删除边,查询当前图是否为二分图 本来想练lct,然后发现了线段树分治的做法,感觉好厉害. lct做法的核心就是维护删除时间的最大生成树 首先口胡一个分块做法,和hno ...

  9. CDOJ 1292 卿学姐种花 暴力 分块 线段树

    卿学姐种花 题目连接: http://acm.uestc.edu.cn/#/problem/show/1292 Description 众所周知,在喵哈哈村,有一个温柔善良的卿学姐. 卿学姐喜欢和她一 ...

随机推荐

  1. JAVA基本数据类型转换的注意事项

    JAVA中基本数据类型: 类型: 字节: 范围: 默认值: byte 1 -128~127 0 short 2 -32768~32767 0 char 2 0~65535 '\u0000' int 4 ...

  2. Python 之 基础知识(二)

    一.分支运算 在Python 2.x中判断不等于还可以用<> if语句进阶:elif if 条件1: ...... elif 条件2: ...... else: ...... 二.逻辑运算 ...

  3. sites for debugging script

    1. javascript debugger online: http://jsfiddle.net/ 2. script(js,python,ruby) debugger online: http: ...

  4. Ext未定义问题解决

    做的项目用到EXT.NET,调试时候没问题,发布到IIS上出现EXT未定义,把项目的应用程序池改为Classic 模式就可以了.

  5. SourceInsight使用入门与技巧(转)

    1 sourceinsight screen font 的默认字体是Verdana的,它是一直变宽字体.在Document style中可以将字体改为定宽的Courier 2   document o ...

  6. Java中的强制转换

    特点: 1.需要程序员手动修改代码 2.语法:范围小的类型 变量名 = (范围小的类型)范围大的类型的数据 3.从范围小 到 范围大  注意: 强制类型转换可能会造成数据的丢失哦,小伙伴们在应用时一定 ...

  7. java调用第三方命令,process.waitfor()挂起(你不知道的坑)

    我们常在java中运行第三方程序,如sh.python,java提供一个Runtime.exec()方法,生成一个Process对象.今天在使用这个方法的时候,发现接口半天没有返回数据.查了一下,原来 ...

  8. 【CF666E】Forensic Examination - 广义后缀自动机+线段树合并

    广义SAM专题的最后一题了……呼 题意: 给出一个长度为$n$的串$S$和$m$个串$T_{1\cdots m}$,给出$q$个询问$l,r,pl,pr$,询问$S[pl\cdots pr]$在$T_ ...

  9. LCIS 最长公共上升子序列问题DP算法及优化

    一. 知识简介 学习 LCIS 的预备知识: 动态规划基本思想, LCS, LIS 经典问题:给出有 n 个元素的数组 a[] , m 个元素的数组 b[] ,求出它们的最长上升公共子序列的长度. 例 ...

  10. js生产随机数

    var chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXTZabcdefghiklmnopqrstuvwxyz"; var string_le ...