这道题就是不要求强制在线的 BZOJ 3744 Gty的妹子序列

所以说离线做法有莫队,在线做法见上面连接.

这里贴出常数巨大O(nnlogn)O(n\sqrt nlogn)O(nn​logn)分块+树状数组+主席树做法.

CODE

  1. #include <cmath>
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <algorithm>
  5. using namespace std;
  6. template<typename T>inline void read(T &num) {
  7. char ch; int flg = 1;
  8. while((ch=getchar())<'0'||ch>'9')if(ch=='-')flg=-flg;
  9. for(num=0;ch>='0'&&ch<='9';num=num*10+ch-'0',ch=getchar());
  10. num*=flg;
  11. }
  12. const int MAXN = 50005;
  13. int n, m, N, B, f[225][MAXN], a[MAXN], b[MAXN], bel[MAXN];
  14. int ch[MAXN*20][2], sz[MAXN*20], rt[MAXN], tot;
  15. void insert(int &i, int p, int l, int r, int x) {
  16. sz[i=++tot] = sz[p] + 1;
  17. if(l == r) return;
  18. int mid = (l + r) >> 1;
  19. if(x <= mid) ch[i][1] = ch[p][1], insert(ch[i][0], ch[p][0], l, mid, x);
  20. else ch[i][0] = ch[p][0], insert(ch[i][1], ch[p][1], mid+1, r, x);
  21. }
  22. int query(int x, int y, int l, int r, int L, int R) {
  23. if(sz[x] == sz[y]) return 0;
  24. if(L <= l && r <= R) return sz[y]-sz[x];
  25. int mid = (l + r) >> 1;
  26. if(R <= mid) return query(ch[x][0], ch[y][0], l, mid, L, R);
  27. else if(L > mid) return query(ch[x][1], ch[y][1], mid+1, r, L, R);
  28. return query(ch[x][0], ch[y][0], l, mid, L, R) + query(ch[x][1], ch[y][1], mid+1, r, L, R);
  29. }
  30. int T[MAXN];
  31. inline void upd(int x, int val) {
  32. while(x) T[x] += val, x -= x&-x;
  33. }
  34. inline int qsum(int x) { int res = 0;
  35. while(x <= N) res += T[x], x += x&-x;
  36. return res;
  37. }
  38. inline int solve(int L, int R) {
  39. if(L > R) swap(L, R);
  40. int res = 0;
  41. if(bel[L] == bel[R]) {
  42. for(int i = L; i <= R; ++i)
  43. res += qsum(a[i]+1), upd(a[i], 1);
  44. for(int i = L; i <= R; ++i) upd(a[i], -1);
  45. return res;
  46. }
  47. res = f[bel[L]+1][R];
  48. for(int i = L; i <= bel[L]*B && i < R; ++i)
  49. res += query(rt[i], rt[R], 1, N, 1, a[i]-1);
  50. return res;
  51. }
  52. int main () {
  53. read(n); B = sqrt(n);
  54. for(int i = 1; i <= n; ++i) read(a[i]), b[++N] = a[i];
  55. sort(b + 1, b + N + 1);
  56. N = unique(b + 1, b + N + 1) - b - 1;
  57. for(int i = 1; i <= n; ++i) a[i] = lower_bound(b + 1, b + N + 1, a[i]) - b;
  58. for(int i = 1; i <= n; ++i) {
  59. bel[i] = (i-1)/B + 1;
  60. insert(rt[i], rt[i-1], 1, N, a[i]);
  61. }
  62. for(int i = 1; i <= bel[n]; ++i) {
  63. for(int j = (i-1)*B+1; j <= n; ++j)
  64. f[i][j] = f[i][j-1] + qsum(a[j]+1), upd(a[j], 1);
  65. memset(T, 0, (N+1)<<2);
  66. }
  67. int x, y;
  68. read(m);
  69. while(m--) {
  70. read(x), read(y);
  71. printf("%d\n", solve(x, y));
  72. }
  73. }

BZOJ 3289: Mato的文件管理 (区间查询逆序对)的更多相关文章

  1. bzoj 3289 Mato的文件管理 区间逆序对数(离线) 莫队

    题目链接 题意 给定\(n\)个数,\(q\)个询问,每次询问\([l,r]\)区间内的逆序对数. 思路 莫队+树状数组 注意离散化 Code #include <bits/stdc++.h&g ...

  2. Bzoj 3289: Mato的文件管理 莫队,树状数组,逆序对,离散化,分块

    3289: Mato的文件管理 Time Limit: 40 Sec  Memory Limit: 128 MBSubmit: 1539  Solved: 665[Submit][Status][Di ...

  3. BZOJ 3289 Mato的文件管理(莫队+离散化求逆序数)

    3289: Mato的文件管理 Time Limit: 40 Sec  Memory Limit: 128 MB Submit: 2171  Solved: 891 [Submit][Status][ ...

  4. BZOJ 3289: Mato的文件管理[莫队算法 树状数组]

    3289: Mato的文件管理 Time Limit: 40 Sec  Memory Limit: 128 MBSubmit: 2399  Solved: 988[Submit][Status][Di ...

  5. BZOJ 3289: Mato的文件管理

    3289: Mato的文件管理 Time Limit: 40 Sec  Memory Limit: 128 MBSubmit: 2368  Solved: 971[Submit][Status][Di ...

  6. BZOJ 3289: Mato的文件管理 莫队+BIT

    3289: Mato的文件管理 Description Mato同学从各路神犇以各种方式(你们懂的)收集了许多资料,这些资料一共有n份,每份有一个大小和一个编号.为了防止他人偷拷,这些资料都是加密过的 ...

  7. bzoj 3289: Mato的文件管理 莫队+树状数组

    3289: Mato的文件管理 Time Limit: 40 Sec  Memory Limit: 128 MB[Submit][Status][Discuss] Description Mato同学 ...

  8. BZOJ 3289: Mato的文件管理 【莫队 + 树状数组】

    任意门:https://www.lydsy.com/JudgeOnline/problem.php?id=3289 3289: Mato的文件管理 Time Limit: 40 Sec  Memory ...

  9. bzoj 3289 Mato的文件管理 树状数组+莫队

    Mato的文件管理 Time Limit: 40 Sec  Memory Limit: 128 MBSubmit: 4325  Solved: 1757[Submit][Status][Discuss ...

随机推荐

  1. oracle建表字段包含关键字注意事项

    SQL建表时最好不要把表定义成关键字字段 1 若不小心把表定义成关键字了,比如option, desc等等,oracle版本查询会有问题,短期内无法修改字段名称的,暂时用字段名+双引号解决: SELE ...

  2. Java静态代理与动态代理实现

    一.什么是代理 代理是一种设计模式,它提供了一种通过代理访问目标对象的方式.在应用代理之前,我们调用对象的过程如下: 客户端直接调用对象并获取返回值.而应用了代理之后,我们调用对象的过程变成如下: 客 ...

  3. typora的基本使用技巧汇总

    typora的基本使用技巧汇总 链接: https://www.jianshu.com/p/380005c8f104

  4. iframe/frameset/frame的区别

    目录 iframe iframe属性的用法 iframe属性的取值 iframe的书写格式 frameset frameset的用法(框架模板) frameset属性的属性值 frame frame的 ...

  5. spring配置文件和spring mvc配置文件的区别

    Question: Are applicationContext.xml and spring-servlet.xml related anyhow in Spring Framework? Will ...

  6. Django(一)安装启动

    Django下载/启动 1.下载安装 pip install django 或者 压缩文件下载地址:https://github.com/django/django/releases python s ...

  7. Graphite简要教程

    转载自DevOps实战:Graphite监控上手指南 英文原文Getting Started with Monitoring using Graphite 英文原文Google快照 作者 Frankl ...

  8. codeforce E - Minimal Labels+hdu 4857

    两个题目的意思差不多 都是希望得出的拓扑序如果有多种 要求输出字典序小的情况 这里引用一个大佬的博客 关于为什么不能直接建图然后用小根堆解决这个问题(http://blog.csdn.net/rgno ...

  9. IOC+EF+Core项目搭建IOC注入及框架(二)

    配置ServiceCollection /// <summary> /// 表示IServiceCollection的扩展 /// </summary> public stat ...

  10. service程序改为windows窗体展示

    首先将exe程序文件进行快捷创建.然后就会生成一个 exe -shortCut 程序,然后进入属性中,并且进行修改引用路径,在路径xx.exe 后面加一个空格和/tt,保存,这样就可以正常运行了. 如 ...