题面

luogu

cdq分治入门

注意删的是值不是位置!


  1. #include <cstdio>
  2. #include <algorithm>
  3. #include <cmath>
  4. #include <cstring>
  5. using namespace std;
  6. const int N = 1e5 + 5;
  7. const int inf = 0x3f3f3f3f;
  8. struct Node{
  9. int x, y, z;
  10. long long cnt;
  11. }node[N];
  12. inline bool rule_xyz(Node x, Node y){
  13. if(x.x != y.x) return x.x < y.x;
  14. if(x.y != y.y) return x.y < y.y;
  15. return x.z < y.z;
  16. }
  17. inline bool rule_yzx(Node x, Node y){
  18. if(x.y != y.y) return x.y < y.y;
  19. if(x.z != y.z) return x.z < y.z;
  20. return x.x < y.x;
  21. }
  22. int n, m, a[N], b[N];
  23. inline void debug(int L, int R){
  24. for(int i = L; i <= R; ++i){
  25. if(node[i].x == 1){
  26. printf("debug %lld\n", node[i].cnt);
  27. break;
  28. }
  29. }
  30. }
  31. struct BIT{
  32. int w[N];
  33. void ins(int x, int d){
  34. while(x <= n){w[x] += d; x += x & -x;}
  35. }
  36. int qry(int x){
  37. int res = 0;
  38. while(x){res += w[x]; x -= x & -x;}
  39. return res;
  40. }
  41. void print(){
  42. for(int i = 1; i <= n; ++i) printf("%d ", w[i]);
  43. printf("\n");
  44. }
  45. }bit;
  46. void cdq(int L, int R){
  47. if(L >= R) return ;
  48. int mid = L + ((R - L) >> 1);
  49. cdq(L, mid); cdq(mid + 1, R);
  50. sort(node + L, node + mid + 1, rule_yzx);
  51. sort(node + mid + 1, node + R + 1, rule_yzx);
  52. int j = mid + 1;
  53. for(int i = L; i <= mid; ++i){
  54. while(j <= R && node[j].y < node[i].y){
  55. bit.ins(node[j].z, 1); ++j;
  56. }
  57. node[i].cnt += bit.qry(n) - bit.qry(node[i].z);
  58. }
  59. while(--j >= mid + 1){bit.ins(node[j].z, -1);}
  60. j = R;
  61. for(int i = mid; i >= L; --i){
  62. while(j >= mid + 1 && node[j].y > node[i].y){
  63. bit.ins(node[j].z, 1); --j;
  64. }
  65. node[i].cnt += bit.qry(node[i].z - 1);
  66. }
  67. while(++j <= R) {bit.ins(node[j].z, -1);}
  68. //printf("%d %d\n", L, R);
  69. //bit.print();
  70. //if(L <= 1) debug(L, R);
  71. }
  72. int main(){
  73. //freopen();
  74. scanf("%d%d", &n, &m);
  75. for(int i = 1; i <= n; ++i){
  76. scanf("%d", &a[i]);
  77. b[a[i]] = i;
  78. }
  79. for(int i = 1; i <= n; ++i)
  80. node[i] = (Node){inf, i, a[i], 0};
  81. for(int i = 1, x; i <= m; ++i){
  82. scanf("%d", &x);
  83. node[b[x]].x = i;//注意审题哦 这里是删掉为x的值
  84. }
  85. sort(node + 1, node + n + 1, rule_xyz);
  86. cdq(1, n);
  87. sort(node + 1, node + n + 1, rule_xyz);
  88. long long ans = 0;
  89. for(int i = n; i >= 1; --i){
  90. ans += bit.qry(a[i]);
  91. bit.ins(a[i], 1);
  92. }
  93. for(int i = 1; i <= m; ++i){
  94. printf("%lld\n", ans);
  95. ans -= node[i].cnt;
  96. }
  97. return 0;
  98. }

动态逆序对[CDQ分治]的更多相关文章

  1. P3157 动态逆序对 CDQ分治

    动态逆序对 CDQ分治 传送门:https://www.luogu.org/problemnew/show/P3157 题意: 对于序列A,它的逆序对数定义为满足i<j,且Ai>Aj的数对 ...

  2. [BZOJ3295][Cqoi2011]动态逆序对 CDQ分治&树套树

    3295: [Cqoi2011]动态逆序对 Time Limit: 10 Sec  Memory Limit: 128 MB Description 对于序列A,它的逆序对数定义为满足i<j,且 ...

  3. BZOJ 3295 动态逆序对 | CDQ分治

    BZOJ 3295 动态逆序对 这道题和三维偏序很类似.某个元素加入后产生的贡献 = time更小.pos更小.val更大的元素个数 + time更小.pos更大.val更小的元素个数. 分别用类似C ...

  4. 【BZOJ3295】[Cqoi2011]动态逆序对 cdq分治

    [BZOJ3295][Cqoi2011]动态逆序对 Description 对于序列A,它的逆序对数定义为满足i<j,且Ai>Aj的数对(i,j)的个数.给1到n的一个排列,按照某种顺序依 ...

  5. bzoj3295: [Cqoi2011]动态逆序对(cdq分治+树状数组)

    3295: [Cqoi2011]动态逆序对 题目:传送门 题解: 刚学完cdq分治,想起来之前有一道是树套树的题目可以用cdq分治来做...尝试一波 还是太弱了...想到了要做两次cdq...然后伏地 ...

  6. BZOJ3295 [Cqoi2011]动态逆序对 —— CDQ分治

    题目链接:https://vjudge.net/problem/HYSBZ-3295 3295: [Cqoi2011]动态逆序对 Time Limit: 10 Sec  Memory Limit: 1 ...

  7. [CQOI2011]动态逆序对 CDQ分治

    洛谷上有2道相同的题目(基本是完全相同的,输入输出格式略有不同) ---题面--- ---题面--- CDQ分治 首先由于删除是很不好处理的,所以我们把删除改为插入,然后输出的时候倒着输出即可 首先这 ...

  8. 洛谷 P3157 [CQOI2011]动态逆序对 | CDQ分治

    题目:https://www.luogu.org/problemnew/show/3157 题解: 1.对于静态的逆序对可以用树状数组做 2.我们为了方便可以把删除当成增加,可以化动为静 3.找到三维 ...

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

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

  10. BZOJ3295:[CQOI2011]动态逆序对(CDQ分治)

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

随机推荐

  1. OSS网页上传和断点续传(终结篇)

    有了之前OSS网页上传和断点续传(OSS配置篇)和(STSToken篇),其万事俱备只欠东风啦,此终结篇即将展示OSS上传文件及断点续传的无限魅力... 网络卡顿.延迟能续传吗?能! 关了浏览器,还能 ...

  2. Echatrs 中PIE饼图中间位置怎么显示总数值?

    title: { text: '总资产', subtext: '2000000.00', x: 'center', y: 'center' }图例:

  3. 学习yii2.0——依赖注入

    依赖注入 依赖注入是一种设计模式,可以搜索“php依赖注入”,这里不阐述了. yii框架的依赖注入 Yii 通过 yii\di\Container 类提供 DI 容器特性. 它支持如下几种类型的依赖注 ...

  4. JSLinux

    JSLinuxhttps://bellard.org/jslinux/vm.html?url=https://bellard.org/jslinux/win2k.cfg&mem=192& ...

  5. 如何在 Linux 中查找最大的 10 个文件

    https://linux.cn/article-9495-1.html

  6. Oracle RMAN备份与还原

    RMAN在数据库服务器的帮助下实现数据库文件.控制文件.数据库文件与控制文件的映像副本.归档日志文件.数据库服务器参数文件的备份. RMAN的特点: (1) 支持增量备份:传统的exp与expdp备份 ...

  7. CMake--List用法

    list(LENGTH <list><output variable>) list(GET <list> <elementindex> [<ele ...

  8. Linux基础学习(10)--Shell基础

    第十章——Shell基础 一.Shell概述 1.Shell是什么: (1)Shell是一个命令行解释器,它为用户提供了一个向Linux内核发送请求以便运行程序的界面系统级程序,用户可以用Shell来 ...

  9. Delphi 限制Edit输入 多个例子

    procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char); begin if not (key in [ '.',#8]) then ...

  10. LODOP暂存、应用、复原 按钮的区别

    LODOP中打印设计(PRINT_DESIGN)有暂存和复原按钮,打印维护(PRINT_SETUP)有应用和复原按钮. 打印设计暂存和打印维护的应用功能不同,两者的区别:1.打印设计的暂存.复原(类似 ...