题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=3295


mamaya,弱鸡xrdog终于会写树套树啦....

将树状数组中每一个节点看成一棵平衡树,支持$RANK$操作,每次删除一个数之前,支持查询位置在当前数之前权值比他大的有多少个,查询位置在当前数之后权值比他小的有多少个,再支持删除操作。

复杂度${O(nlogn^{2})}$,空间复杂度${O(nlogn)}$


  1. #include<iostream>
  2. #include<ext/pb_ds/assoc_container.hpp>
  3. #include<cstdio>
  4. #include<algorithm>
  5. #include<vector>
  6. #include<cstdlib>
  7. #include<cmath>
  8. #include<cstring>
  9. #include<set>
  10. using namespace std;
  11. using namespace __gnu_pbds;
  12. #define maxn 1001000
  13. #define llg long long
  14. #define yyj(a) freopen(a".in","r",stdin),freopen(a".out","w",stdout);
  15. llg n,m,d[maxn],ans,wz[maxn],v;
  16. tree<llg,null_type,less<llg>,rb_tree_tag,tree_order_statistics_node_update>c[maxn];
  17.  
  18. //tree<llg,null_mapped_type,less<llg>,rb_tree_tag,tree_order_statistics_node_update>c[maxn]; //-----如果您的编译器版本较低(BZOJ)
  19. llg cc[maxn];
  20. inline llg lowbit(llg x){return x&-x;}
  21.  
  22. void add(llg x,llg val) {while (x<=n) {c[x].insert(val);x+=lowbit(x);}}
  23.  
  24. void del(llg x,llg val) {while (x<=n) c[x].erase(val),x+=lowbit(x);}
  25.  
  26. void add_(llg x,llg val) {while (x<=n) cc[x]+=val,x+=lowbit(x);}
  27.  
  28. llg sum_(llg x) {llg tot=; while (x>) tot+=cc[x],x-=lowbit(x); return tot;}
  29.  
  30. llg sum(llg x,llg val)
  31. {
  32. llg tot=;
  33. while (x>)
  34. {
  35. tot+=c[x].size();
  36. llg xiao=c[x].order_of_key(val+);
  37. tot-=xiao;
  38. x-=lowbit(x);
  39. }return tot;
  40. }
  41.  
  42. llg summ(llg x,llg val)
  43. {
  44. llg tot=;
  45. while (x>)
  46. {
  47. tot+=c[x].order_of_key(val+);
  48. x-=lowbit(x);
  49. }
  50. return tot;
  51. }
  52.  
  53. void init()
  54. {
  55. cin>>n>>m;
  56. for (llg i=;i<=n;i++)
  57. {
  58. scanf("%lld",&d[i]);
  59. wz[d[i]]=i;
  60. ans+=sum_(n)-sum_(d[i]);
  61. add_(d[i],);
  62. add(i,d[i]);
  63. }
  64.  
  65. }
  66.  
  67. void work()
  68. {
  69. llg x,da,xiao;
  70. while (m--)
  71. {
  72. printf("%lld\n",ans);
  73. scanf("%lld",&v);
  74. x=wz[v];
  75. da=sum(x,v);
  76. xiao=summ(n,v)-summ(x,v);
  77. ans-=da+xiao;
  78. del(x,v);
  79. }
  80. }
  81.  
  82. int main()
  83. {
  84. yyj("bzoj3295");
  85. init();
  86. work();
  87. return ;
  88. }

【BZOJ】3295: [Cqoi2011]动态逆序对的更多相关文章

  1. BZOJ 3295: [Cqoi2011]动态逆序对

    3295: [Cqoi2011]动态逆序对 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 3865  Solved: 1298[Submit][Sta ...

  2. Bzoj 3295: [Cqoi2011]动态逆序对 分块,树状数组,逆序对

    3295: [Cqoi2011]动态逆序对 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 2886  Solved: 924[Submit][Stat ...

  3. bzoj 3295 [Cqoi2011]动态逆序对(cdq分治,BIT)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3295 [题意] n个元素依次删除m个元素,求删除元素之前序列有多少个逆序对. [思路] ...

  4. 【刷题】BZOJ 3295 [Cqoi2011]动态逆序对

    Description 对于序列A,它的逆序对数定义为满足i<j,且Ai>Aj的数对(i,j)的个数.给1到n的一个排列,按照某种顺序依次删除m个元素,你的任务是在每次删除一个元素之前统计 ...

  5. bzoj 3295: [Cqoi2011]动态逆序对(树套树 or CDQ分治)

    Description 对于序列A,它的逆序对数定义为满足i<j,且Ai>Aj的数对(i,j)的个数.给1到n的一个排列,按照某种顺序依次删除m个元素,你的任务是在每次删除一个元素之前统计 ...

  6. BZOJ 3295: [Cqoi2011]动态逆序对 [CDQ分治]

    RT 传送门 首先可以看成倒着插入,求逆序对数 每个数分配时间(注意每个数都要一个时间)$t$,$x$位置,$y$数值 $CDQ(l,r)$时归并排序$x$ 然后用$[l,mid]$的加入更新$[mi ...

  7. BZOJ 3295 [CQOI2011]动态逆序对 (三维偏序CDQ+树状数组)

    题目大意: 题面传送门 还是一道三维偏序题 每次操作都可以看成这样一个三元组 $<x,w,t>$ ,操作的位置,权值,修改时间 一开始的序列看成n次插入操作 我们先求出不删除时的逆序对总数 ...

  8. BZOJ 3295 [Cqoi2011]动态逆序对 ——CDQ分治

    时间.位置.数字为三个属性. 排序时间,CDQ位置,树状数组处理数字即可. #include <cstdio> #include <cstring> #include < ...

  9. 【BZOJ 3295】动态逆序对 - 分块+树状数组

    题目描述 给定一个1~n的序列,然后m次删除元素,每次删除之前询问逆序对的个数. 分析:分块+树状数组 (PS:本题的CDQ分治解法见下一篇) 首先将序列分成T块,每一块开一个树状数组,并且先把最初的 ...

  10. 【Bzoj 3295】 动态逆序对(树套树|CDQ分治)

    [题意] 每次删除一个数,然后问删除前逆序对数. [分析] 没有AC不开心.. 我的树状数组套字母树,应该是爆空间的,空间复杂度O(nlogn^2)啊..哭.. 然后就没有然后了,别人家的树套树是树状 ...

随机推荐

  1. [转载]web安全之token

    参考:http://blog.csdn.net/sum_rain/article/details/37085771 Token,就是令牌,最大的特点就是随机性,不可预测.一般黑客或软件无法猜测出来. ...

  2. Spring MVC 编程流程步骤

    Spring MVC 编程流程步骤 1. 建立Maven工程 2. 添加Spring MVC依赖 <dependencies> <dependency> <groupId ...

  3. 虚拟继承C++

    C++中虚拟继承的概念 为了解决从不同途径继承来的同名的数据成员在内存中有不同的拷贝造成数据不一致问题,将共同基类设置为虚基类.这时从不同的路径继承过来的同名数据成员在内存中就只有一个拷贝,同一个函数 ...

  4. 计算概论(A)/基础编程练习(数据成分)/3:整数的个数

    #include<stdio.h> int main() { ] = {}; // 输入k个正整数 scanf("%d",&k); // 循环读入和进行算术 w ...

  5. K8S学习笔记之Kubernetes核心概念

    0x00  Kubernetes简介 Kubernetes(K8S)是Google开源的容器集群管理系统,其设计源于Google在容器编排方面积累的丰富经验,并结合社区创新的最佳实践. K8S在Doc ...

  6. css链接link

    链接可以使用任何css属性,包括字体.颜色.背景等等. 链接有四个状态,可在四个状态时设置不同的属性 a:link - 正常,未访问过的链接 a:visited - 用户已访问过的链接 a:hover ...

  7. fjwc2019 D2T2 定价 (栈+set+贪心)

    #182. 「2019冬令营提高组」定价 先瞄下数据范围 对于所有数据,1≤n≤1000,1≤m≤10^9,1≤q≤500000 .\textbf{2 操作的个数不超过 1000.} $10^9$位, ...

  8. rabbitmq heartbeat missing with heartbeat = N seconds原因总结

    一直以来,在我们大规模使用rabbitmq的服务端应用中,都没有出现rabbitmq心跳超时而造成的的影响,反倒是在rabbitmq-cpp客户端出现过很多次该问题,一直以为客户端lib实现的问题(不 ...

  9. Java中断异常 InterruptedException 的正确处理方式

    你看到这篇文件可能是因为你已经调用了一个抛出 InterruptedException 异常的方法,并且需要以某种方式处理它. 首先,需要了解为一个方法为啥会 throws InterruptedEx ...

  10. Latex 公式积累

    NLP 语言模型 最大似然估计 \(p(w_{i} | w_{i-1}) = \frac{c(w_{i-1}w_{i})}{\sum \limits_{w_{i}} c(w_{i-1}w_{i})}\ ...