1. #include<bits/stdc++.h>
  2. #define LL long long
  3. #define fi first
  4. #define se second
  5. #define mk make_pair
  6. #define PII pair<int, int>
  7. #define PLI pair<LL, int>
  8. #define PLL pair<LL, LL>
  9. #define y1 skldjfskldjg
  10. #define y2 skldfjsklejg
  11.  
  12. using namespace std;
  13.  
  14. const int N = 1e5 + ;
  15. const int M = 1e5 + ;
  16. const int inf = 0x3f3f3f3f;
  17. const LL INF = 0x3f3f3f3f3f3f3f3f;
  18. const int mod = 1e9 +;
  19. const double PI = acos(-);
  20. const double eps = 1e-;
  21.  
  22. int n, m, pos[N], R[N], L[N];
  23. LL ans[N];
  24.  
  25. struct BIT {
  26. int a[N];
  27. void modify(int x, int v) {
  28. for(int i = x; i <= n; i += i & -i)
  29. a[i] += v;
  30. }
  31. int sum(int x) {
  32. int ans = ;
  33. for(int i = x; i; i -= i & -i)
  34. ans += a[i];
  35. return ans;
  36. }
  37.  
  38. } bit;
  39.  
  40. struct QUS {
  41. int t, x, val;
  42. } qus[N], tmp[N];
  43.  
  44. void cdq(int l, int r) {
  45. if(l == r) return;
  46. int mid = l + r >> ;
  47. cdq(l, mid); cdq(mid + , r);
  48.  
  49. int j = l;
  50. for(int i = mid + ; i <= r; i++) {
  51. while(j <= mid && qus[j].x < qus[i].x) bit.modify(qus[j++].val, );
  52. L[qus[i].t] += bit.sum(n) - bit.sum(qus[i].val);
  53. }
  54. for(int i = j - ; i >= l; i--) bit.modify(qus[i].val, -);
  55.  
  56. j = mid;
  57. for(int i = r; i >= mid + ; i--) {
  58. while(j >= l && qus[j].x > qus[i].x) bit.modify(qus[j--].val, );
  59. R[qus[i].t] += bit.sum(qus[i].val - );
  60. }
  61. for(int i = j + ; i <= mid; i++) bit.modify(qus[i].val, - );
  62.  
  63. int tot = l, p = l, q = mid + ;
  64. while(p <= mid && q <= r) {
  65. if(qus[p].x < qus[q].x) tmp[tot++] = qus[p++];
  66. else tmp[tot++] = qus[q++];
  67. }
  68. while(p <= mid) tmp[tot++] = qus[p++];
  69. while(q <= r) tmp[tot++] = qus[q++];
  70. for(int i = l; i <= r; i++) qus[i] = tmp[i];
  71. }
  72.  
  73. int main() {
  74. scanf("%d%d", &n, &m);
  75. for(int i = ; i <= n; i++) {
  76. int val; scanf("%d", &val);
  77. pos[val] = i;
  78. }
  79.  
  80. int idx = n;
  81. for(int i = ; i <= m; i++) {
  82. int val; scanf("%d", &val);
  83. qus[idx].val = val;
  84. qus[idx].t = idx;
  85. qus[idx--].x = pos[val];
  86. pos[val] = -;
  87. }
  88.  
  89. for(int i = ; i<= n; i++) {
  90. if(pos[i] != -) {
  91. qus[idx].val = i;
  92. qus[idx].t = idx;
  93. qus[idx--].x = pos[i];
  94. pos[i] = -;
  95. }
  96. }
  97.  
  98. cdq(, n);
  99. for(int i = ; i <= n; i++) ans[i] = ans[i - ] + R[i] + L[i];
  100. for(int i = n; i > n - m; i--) printf("%lld\n", ans[i]);
  101. return ;
  102. }
  103. /*
  104. */

bzoj 3295 CDQ求动态逆序对的更多相关文章

  1. BZOJ 3295:[Cqoi2011]动态逆序对(三维偏序 CDQ分治+树状数组)

    http://www.lydsy.com/JudgeOnline/problem.php?id=3295 题意:简单明了. 思路:终于好像有点明白CDQ分治处理三维偏序了.把删除操作看作是插入操作,那 ...

  2. 洛谷P1393 动态逆序对(CDQ分治)

    传送门 题解 听别人说这是洛谷用户的双倍经验啊……然而根本没有感觉到……因为另外的那题我是用树状数组套主席树做的……而且莫名其妙感觉那种方法思路更清晰(虽然码量稍稍大了那么一点点)……感谢Candy大 ...

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

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

  4. [BZOJ 3295] [luogu 3157] [CQOI2011]动态逆序对(树状数组套权值线段树)

    [BZOJ 3295] [luogu 3157] [CQOI2011] 动态逆序对 (树状数组套权值线段树) 题面 给出一个长度为n的排列,每次操作删除一个数,求每次操作前排列逆序对的个数 分析 每次 ...

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

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

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

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

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

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

  8. cdq分治(hdu 5618 Jam's problem again[陌上花开]、CQOI 2011 动态逆序对、hdu 4742 Pinball Game、hdu 4456 Crowd、[HEOI2016/TJOI2016]序列、[NOI2007]货币兑换 )

    hdu 5618 Jam's problem again #include <bits/stdc++.h> #define MAXN 100010 using namespace std; ...

  9. bzoj千题计划146:bzoj3295: [Cqoi2011]动态逆序对

    http://www.lydsy.com/JudgeOnline/problem.php?id=3295 正着删除看做倒着添加 对答案有贡献的数对满足以下3个条件: 出现时间:i<=j 权值大小 ...

随机推荐

  1. C. Line (扩展欧几里得)

    C. Line time limit per test 1 second memory limit per test 256 megabytes input standard input output ...

  2. bzoj 1564 [NOI2009]二叉查找树 区间DP

    [NOI2009]二叉查找树 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 906  Solved: 630[Submit][Status][Discu ...

  3. HDU1024 最大m子段和

    Max Sum Plus Plus Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others ...

  4. python内置函数lambda、filter、map、reduce

    lambda匿名函数 1.lambda只是一个表达式,函数体比def简单多. 2.lambda的主体是一个表达式,而不是一个代码块.仅仅能在lambda表达式中封装有限的逻辑进去 3.lambda函数 ...

  5. HDU 2577 How to Type (字符串处理)

    题目链接 Problem Description Pirates have finished developing the typing software. He called Cathy to te ...

  6. js中三种定义变量 const, var, let 的区别

    js中三种定义变量的方式const, var, let的区别 1.const定义的变量不可以修改,而且必须初始化. 1 const b = 2;//正确 2 // const b;//错误,必须初始化 ...

  7. hdu 1272 小希的迷宫(并查集+最小生成树+队列)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1272 小希的迷宫 Time Limit: 2000/1000 MS (Java/Others)     ...

  8. adb端口被占用解决

    解决ADB端口占用问题 方式一5037为adb默认端口,若5037端口被占用,查看占用端口的进程PIDC:\Users\wwx229495>netstat -aon|findstr 5037  ...

  9. 【Git/GitHub学习笔记】基本操作——创建仓库,本地、远程同步等

    近日想分享一些文件,但是用度盘又太麻烦了(速度也很恶心).所以突发奇想去研究了下GitHub的仓库,这篇文章也就是一个最最最基础的基本操作.基本实现了可以在GitHub上存储文本信息与代码. 由于我的 ...

  10. ubuntu下定时弹窗记录工作日志

    背景 记录工作日志,是一个很好的习惯,但不容易坚持,本来打算每天记录,但经常拖延,拖着拖着,有一些事情就忘记了. 等到写周报或月报的时候,才会开始翻邮件,聊天记录,各个仓库的提交log等,回忆都干了些 ...