【LG1393】动态逆序对

题面

洛谷

题解

\(CDQ\)分治,按照时间来分治

应为一个删除不能对前面的操作贡献,所以考虑一个删除操作对它后面时间的操作的贡献

用上一个答案减去次贡献即可

代码

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstdlib>
  4. #include <cstring>
  5. #include <cmath>
  6. #include <algorithm>
  7. #include <vector>
  8. using namespace std;
  9. namespace IO {
  10. const int BUFSIZE = 1 << 20;
  11. char ibuf[BUFSIZE], *is = ibuf, *it = ibuf;
  12. inline char gc() {
  13. if (is == it) it = (is = ibuf) + fread(ibuf, 1, BUFSIZE, stdin);
  14. return *is++;
  15. }
  16. }
  17. inline int gi() {
  18. register int data = 0, w = 1;
  19. register char ch = 0;
  20. while (ch != '-' && (ch > '9' || ch < '0')) ch = IO::gc();
  21. if (ch == '-') w = -1 , ch = IO::gc();
  22. while (ch >= '0' && ch <= '9') data = data * 10 + (ch ^ 48), ch = IO::gc();
  23. return w * data;
  24. }
  25. const int MAX_N = 40005;
  26. struct Node { int x, y, z, s; } t[MAX_N];
  27. bool cmp_x(Node a, Node b) { return a.x < b.x; }
  28. bool cmp_y(Node a, Node b) { return a.y < b.y; }
  29. int N, M, ans, X[MAX_N], a[MAX_N], b[MAX_N], c[MAX_N], d[MAX_N];
  30. inline int lb(int x) { return x & -x; }
  31. void add(int x, int v) { while (x <= N) c[x] += v, x += lb(x); }
  32. int sum(int x) { int res = 0; while (x > 0) res += c[x], x -= lb(x); return res; }
  33. void Div(int l, int r) {
  34. if (l == r) return ;
  35. int mid = (l + r) >> 1;
  36. Div(l, mid); Div(mid + 1, r);
  37. int j = mid + 1;
  38. for (int i = l; i <= mid; i++) {
  39. for ( ; j <= r && t[j].y < t[i].y; ) add(t[j].z, 1), ++j;
  40. t[i].s += sum(N) - sum(t[i].z);
  41. }
  42. for (int i = mid + 1; i < j; i++) add(t[i].z, -1);
  43. j = r;
  44. for (int i = mid; i >= l; i--) {
  45. for ( ; j > mid && t[j].y > t[i].y; ) add(t[j].z, 1), --j;
  46. t[i].s += sum(t[i].z - 1);
  47. }
  48. for (int i = r; i > j; i--) add(t[i].z, -1);
  49. inplace_merge(&t[l], &t[mid + 1], &t[r + 1], cmp_y);
  50. }
  51. int main () {
  52. N = gi(), M = gi();
  53. for (int i = 1; i <= N; i++) X[i] = a[i] = gi();
  54. sort(&X[1], &X[N + 1]);
  55. for (int i = 1; i <= N; i++) a[i] = lower_bound(&X[1], &X[N + 1], a[i]) - X;
  56. for (int i = N; i >= 1; i--) ans += sum(a[i] - 1), add(a[i], 1);
  57. for (int i = 1; i <= N; i++) t[i].x = N + 1, t[i].y = i, t[i].z = a[i];
  58. for (int i = 1; i <= M; i++) {
  59. d[i] = gi();
  60. t[d[i]].x = i;
  61. }
  62. sort(&t[1], &t[N + 1], cmp_x);
  63. memset(c, 0, sizeof(c));
  64. Div(1, N);
  65. for (int i = 1; i <= N; i++) c[t[i].y] = t[i].s;
  66. printf("%d ", ans);
  67. for (int i = 1; i <= M; i++) printf("%d ", ans -= c[d[i]]);
  68. return 0;
  69. }

【LG1393】动态逆序对的更多相关文章

  1. LG1393 动态逆序对

    问题描述 LG1393 题解 本题可以使用\(\mathrm{CDQ}\)分治完成. 二维偏序 根据偏序的定义,逆序对是一个二维偏序,但这个二维偏序比较特殊: \(i>j,a_i<a_j\ ...

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

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

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

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

  4. 【Luogu1393】动态逆序对(CDQ分治)

    [Luogu1393]动态逆序对(CDQ分治) 题面 题目描述 对于给定的一段正整数序列,我们定义它的逆序对的个数为序列中ai>aj且i < j的有序对(i,j)的个数.你需要计算出一个序 ...

  5. 【BZOJ3295】动态逆序对(线段树,树状数组)

    [BZOJ3295]动态逆序对(线段树,树状数组) 题面 Description 对于序列A,它的逆序对数定义为满足iAj的数对(i,j)的个数.给1到n的一个排列,按照某种顺序依次删除m个元素,你的 ...

  6. bzoj3295[Cqoi2011]动态逆序对 树套树

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

  7. 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; ...

  8. P3157 [CQOI2011]动态逆序对(树状数组套线段树)

    P3157 [CQOI2011]动态逆序对 树状数组套线段树 静态逆序对咋做?树状数组(别管归并QWQ) 然鹅动态的咋做? 我们考虑每次删除一个元素. 减去的就是与这个元素有关的逆序对数,介个可以预处 ...

  9. P3157 [CQOI2011]动态逆序对

    P3157 [CQOI2011]动态逆序对 https://www.luogu.org/problemnew/show/P3157 题目描述 对于序列A,它的逆序对数定义为满足i<j,且Ai&g ...

随机推荐

  1. C#图解教程读书笔记(第3章 类型、存储及变量)

    1.C#的中的数值不具有bool特性. 2.dynamic在使用动态语言编写的程序集时使用,这个不太明白,看到后面需要补充!! 动态化的静态类型 3.对于引用类型,引用是存放在栈中,而数据是存放在堆里 ...

  2. 使用View填充ViewPager

    ViewPager在app开发中十分常见.今天以一个例子详细解读下ViewPager的基础知识. 一.什么是ViewPager 可以这样理解,ViewPager就相当于一个容器,它的里面可以装view ...

  3. pcel安装的mongodb的两个问题的解决方案

    最近工作需要,要使用mongodb,这个是使用 pecl 安装的,跟标准的 mongo 使用还是有区别的,这里不讲区别,只讲两个比较典型的问题该如何处理,具体的文档大家可以直接参考 php 的官方文档 ...

  4. Linux学习总结(十四) 文件的打包和压缩

    文件的压缩和打包,在windos下我们很熟悉.rar和.zip文件,这是两种压缩文件,他们支持单个文件和多个文件的压缩.windos下我们不提及打包的概念,虽然多个文件的压缩肯定存在打包过程.打包和压 ...

  5. python3的print函数

    print()函数也可以接受多个字符串,用逗号“,”隔开,就可以连成一串输出: >>> print('The quick brown fox', 'jumps over', 'the ...

  6. VC++和C语言中常见数据类型转换为字符串的方法

    1.短整型(int) itoa(i,temp,10);///将i转换为字符串放入temp中,最后一个数字表示十进制 itoa(i,temp,2); ///按二进制方式转换 2.长整型(long) lt ...

  7. “ping某个IP地址,如果ping不通则在dos窗口或弹出MsgBox提示原因”的批处理bat命令

    “ping某个IP地址,如果ping不通则在dos窗口提示原因”的批处理bat命令 @echo off&setlocal enabledelayedexpansion title Ping检测 ...

  8. 第23章 I2C—读写EEPR

    本章参考资料:<STM32F76xxx参考手册>.<STM32F7xx规格书>.库帮助文档<STM32F779xx_User_Manual.chm>及<I2C ...

  9. “->”和“.”运算符

    1.指向结构变量的指针. 2.定义:struct stu *pstu, 赋值是把结构变量的首地址赋给指针,不能把结构名给该指针:如, pstu = &boy; 3. 访问结构变量的成员 (*结 ...

  10. 使用 input[type=file]上传文件

    var $file = $('#file'); $('#btn').click(function() { var data = new FormData(); data.append('file', ...