思路:

莫队模板题,转换几次就是找逆序数,用树状数组来储存数就行了

注意要离散化

代码:

  1. #include<queue>
  2. #include<cstring>
  3. #include<set>
  4. #include<map>
  5. #include<stack>
  6. #include<cmath>
  7. #include<vector>
  8. #include<cstdio>
  9. #include<iostream>
  10. #include<algorithm>
  11. #define ll long long
  12. const int N = 50000+5;
  13. using namespace std;
  14. int k[N],p[N],arr[N],pos[N],ans[N],n,m;
  15. struct node{
  16. int l,r;
  17. int id;
  18. }e[N];
  19. bool cmp(node a,node b){
  20. return pos[a.l] == pos[b.l]? a.r < b.r : pos[a.l] < pos[b.l];
  21. }
  22. int lowbit(int x){
  23. return x&(-x);
  24. }
  25. void update(int x,int val){
  26. for(int i = x;i <= n;i += lowbit(i))
  27. arr[i] += val;
  28. }
  29. int sum(int x){
  30. int ret = 0;
  31. for(int i = x;i > 0;i -= lowbit(i)){
  32. ret += arr[i];
  33. }
  34. return ret;
  35. }
  36. void Do(){
  37. //i位置
  38. //L右移,逆序对数减少p[i]的逆序数
  39. //L左移,逆序对数增加p[i-1]的逆序数
  40. //R右移,逆序对数增加大于p[i+1]的数
  41. //R左移,逆序对数减少大于p[i]的数
  42. int L = 1,R = 0;
  43. int ret = 0;
  44. for(int i = 1;i <= m;i++){
  45. while(L < e[i].l){
  46. update(p[L],-1);
  47. ret -= sum(p[L] - 1);
  48. L++;
  49. }
  50. while(L > e[i].l){
  51. L--;
  52. update(p[L],1);
  53. ret += sum(p[L] - 1);
  54. }
  55. while(R < e[i].r){
  56. R++;
  57. update(p[R],1);
  58. ret += R - L + 1 - sum(p[R]); //大于减去自己和比己小的
  59. }
  60. while(R > e[i].r){
  61. update(p[R],-1);
  62. ret -= R - L -sum(p[R]);
  63. R--;
  64. }
  65. ans[e[i].id] = ret;
  66. }
  67. }
  68. int main(){
  69. scanf("%d",&n);
  70. int block = sqrt(n);
  71. for(int i = 1;i <= n;i++){
  72. scanf("%d",&p[i]);
  73. k[i] = p[i];
  74. pos[i] = (i - 1) / block + 1;
  75. }
  76. sort(k+1,k+n+1);
  77. for(int i = 1;i <= n;i++) p[i] = lower_bound(k+1,k+n+1,p[i]) - k;
  78. scanf("%d",&m);
  79. for(int i = 1;i <= m;i++){
  80. scanf("%d%d",&e[i].l,&e[i].r);
  81. e[i].id = i;
  82. }
  83. sort(e+1,e+m+1,cmp); //分块
  84. Do();
  85. for(int i =1;i <= m;i++)
  86. printf("%d\n",ans[i]);
  87. return 0;
  88. }

Mato的文件管理 (莫队)题解的更多相关文章

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

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

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

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

  3. 【BZOJ3289】Mato的文件管理 莫队算法+树状数组

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

  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 MB[Submit][Status][Discuss] Description Mato同学 ...

  6. BZOJ3289[JZYZOJP2018]: Mato的文件管理 莫队+树状数组+离散化

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

  7. bzoj3289 Mato的文件管理 莫队+树状数组

    求逆序对个数,莫队套树状数组 #include<cstdio> #include<iostream> #include<cstring> #include<c ...

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

    题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=3289 思路: 求区间最小交换的次数将区间变成一个不降序列其实就是求区间逆序对的数量,这 ...

  9. 【BZOJ3289】Mato的文件管理 莫队+树状数组

    题目大意:给定一个长度为 N 的序列,M 个询问,每次询问区间逆序对的个数. 题解:用树状数组加速答案转移. 代码如下 #include <bits/stdc++.h> #define f ...

  10. bzoj 3289: Mato的文件管理 莫队+线段树

    题目链接 给一些询问,每个询问给出区间[L, R] , 求这段区间的逆序数. 先分块排序, 然后对于每次更改, 如果是更改L, 那么应该查询区间内比他小的数的个数, 如果更改R, 查区间内比他大的数的 ...

随机推荐

  1. Linux新建用户 useradd&groupadd

    建立一个新组,并设置组ID加入系统:#groupadd -g 1000 sparkgroup #useradd -u 2000 -g sparkgroup sparkuser #mkdir -p /a ...

  2. semi-consistent简介

    semi-consistent简介 http://hedengcheng.com/?p=220 semi-consistent简介    1 semi-consistent实现    2 MySQL ...

  3. java-小技巧-001-Long序列化到前端js不支持

    1.引入:jackson-mapper-asl-1.9.2.jar 2.导入: import org.codehaus.jackson.map.annotate.JsonSerialize;impor ...

  4. Java-小技巧-002-String 转 long

    1.转化 long l = Long.parseLong([String]); 相当于 long l = Long.parseLong([String],10); long l = Long.valu ...

  5. 使用node.js 进行服务器端JavaScript编程

            node.js 入门        node.js 可以运行在 Linux.Windows 和 Macintosh 等主流的操作系统上.在 Windows 平台上运行 node.js ...

  6. 1.0ARM体系结构-ARM体系结构

    对ARMcpu有整体而专业的认识. ARM只是设计arm核,而不生产. ARM 掌握的是标准.

  7. Summary: Lowest Common Ancestor in a Binary Tree & Shortest Path In a Binary Tree

    转自:Pavel's Blog Now let's say we want to find the LCA for nodes 4 and 9, we will need to traverse th ...

  8. 使用 MtVerify.h头文件 ,用的时候把他头文件的内容添加到项目

    #include <windows.h>  //windodws变量相关头文件 MtVerify.h的内容如下:#pragma comment( lib, "USER32&quo ...

  9. Linux系统——JumpServer跳板机的搭建和部署

    公网源部署jumpserver跳板机 建立阿里云公网源yum仓库(服务端)[root@localhost ~]# lsanaconda-ks.cfg install.log.syslog jumpse ...

  10. Ajax学习整理笔记

    AJAX技术的出现使得javascript技术大火.不懂AJAX的同学百度一下,了解AJAX能做什么就可以了. 代码: <!DOCTYPE html> <html> <h ...