题目链接

给一些询问,每个询问给出区间[L, R] , 求这段区间的逆序数。

先分块排序, 然后对于每次更改, 如果是更改L, 那么应该查询区间内比他小的数的个数, 如果更改R, 查区间内比他大的数的个数。

记得离散化。

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define pb(x) push_back(x)
  4. #define ll long long
  5. #define mk(x, y) make_pair(x, y)
  6. #define lson l, m, rt<<1
  7. #define mem(a) memset(a, 0, sizeof(a))
  8. #define rson m+1, r, rt<<1|1
  9. #define mem1(a) memset(a, -1, sizeof(a))
  10. #define mem2(a) memset(a, 0x3f, sizeof(a))
  11. #define rep(i, a, n) for(int i = a; i<n; i++)
  12. #define ull unsigned long long
  13. typedef pair<int, int> pll;
  14. const double PI = acos(-1.0);
  15. const double eps = 1e-;
  16. const int mod = 1e9+;
  17. const int inf = ;
  18. const int dir[][] = { {-, }, {, }, {, -}, {, } };
  19. const int maxn = ;
  20. int a[maxn], ans[maxn], sum[maxn<<], b[maxn];
  21. void pushUp(int rt) {
  22. sum[rt] = sum[rt<<]+sum[rt<<|];
  23. }
  24. void update(int p, int l, int r, int rt, int val) {
  25. if(l == r) {
  26. sum[rt]+=val;
  27. return ;
  28. }
  29. int m = l+r>>;
  30. if(p<=m)
  31. update(p, lson, val);
  32. else
  33. update(p, rson, val);
  34. pushUp(rt);
  35. }
  36. int query(int L, int R, int l, int r, int rt) {
  37. if(R<L)
  38. return ;
  39. if(L<=l&&R>=r) {
  40. return sum[rt];
  41. }
  42. int m = l+r>>, ret = ;
  43. if(L<=m)
  44. ret += query(L, R, lson);
  45. if(R>m)
  46. ret += query(L, R, rson);
  47. return ret;
  48. }
  49. struct node
  50. {
  51. int block, r, l, id;
  52. bool operator < (node a)const
  53. {
  54. if(block == a.block)
  55. return r<a.r;
  56. return block<a.block;
  57. }
  58. }q[maxn];
  59. int main()
  60. {
  61. int n, m;
  62. while(~scanf("%d", &n)) {
  63. for(int i = ; i<=n; i++) {
  64. scanf("%d", &a[i]);
  65. b[i-] = a[i];
  66. }
  67. sort(b, b+n);
  68. int cnt = unique(b, b+n)-b;
  69. for(int i = ; i<=n; i++)
  70. a[i] = lower_bound(b, b+cnt, a[i])-b+;
  71. scanf("%d", &m);
  72. int BLOCK = sqrt(n*1.0);
  73. for(int i = ; i<m; i++) {
  74. scanf("%d%d", &q[i].l, &q[i].r);
  75. q[i].id = i;
  76. q[i].block = q[i].l/BLOCK;
  77. }
  78. mem(sum);
  79. sort(q, q+m);
  80. int tmp = ;
  81. for(int i = q[].l; i<=q[].r; i++) {
  82. tmp += query(a[i]+, n, , n, );
  83. update(a[i], , n, , );
  84. }
  85. ans[q[].id] = tmp;
  86. for(int i = ; i<m; i++) {
  87. for(int j = q[i-].l; j<q[i].l; j++) {
  88. update(a[j], , n, , -);
  89. tmp -= query(, a[j]-, , n, );
  90. }
  91. for(int j = q[i-].l-; j>=q[i].l; j--) {
  92. tmp += query(, a[j]-, , n, );
  93. update(a[j], , n, , );
  94. }
  95. for(int j = q[i-].r+; j<=q[i].r; j++) {
  96. tmp += query(a[j]+, n, , n, );
  97. update(a[j], , n, , );
  98. }
  99. for(int j = q[i-].r; j>q[i].r; j--) {
  100. update(a[j], , n, , -);
  101. tmp -= query(a[j]+, n, , n, );
  102. }
  103. ans[q[i].id] = tmp;
  104. }
  105. for(int i = ; i<m; i++) {
  106. printf("%d\n", ans[i]);
  107. }
  108. }
  109. return ;
  110. }

bzoj 3289: Mato的文件管理 莫队+线段树的更多相关文章

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

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

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

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

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

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

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

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

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

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

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

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

  7. BZOJ 4129 树上带修莫队+线段树

    思路: 可以先做做BZOJ3585 是序列上的mex 考虑莫队的转移 如果当前数字出现过 线段树上把它置成1 对于询问 二分ans 线段树上查 0到ans的和 是不是ans+1 本题就是把它搞到了序列 ...

  8. Codeforces 666E E - Forensic Examination SA + 莫队 + 线段树

    E - Forensic Examination 我也不知道为什么这个复杂度能过, 而且跑得还挺快, 数据比较水? 在sa上二分出上下界, 然后莫队 + 线段树维护区间众数. #include< ...

  9. 洛谷P3246 序列 [HNOI2016] 莫队/线段树+扫描线

    正解:莫队/线段树+扫描线 解题报告: 传送门! 似乎是有两种方法的,,,所以分别港下好了QAQ 第一种,莫队 看到这种询问很多区间之类的就会自然而然地想到莫队趴?然后仔细思考一下,发现复杂度似乎是欧 ...

随机推荐

  1. Response.Redirec方法传递汉字出现乱码

    解决方法: //传参数时Response.Redirect("a.aspx?name"+Server.UrlEncode("我的名字")); //接收参数时 S ...

  2. JDBC操作封装

    这两天学习了一下jdbc的封装,依据的是下面这篇 http://wenku.baidu.com/link?url=FaFDmQouYkKO24ApATHYmA5QzUcj-UE-7RSSZaBWPqk ...

  3. Android入门——UI(8)——Fragment(2)

    先演示一下如何在一个activity中放置两个Fragment,先定义两个Fragment <?xml version="1.0" encoding="utf-8& ...

  4. C++网络爬虫抓取图片

    1.首先取一个初始网页,例如百度图片里面的网页(假设url为 http://image.baidu.com/channel/fashion ): 2.向image.baidu.com发送一个请求(GE ...

  5. 使用ajax异步提交表单

    虽然这篇文章的标题是提交表单,但是主要的难点在于使用ajax提交文本域的内容, 在工作中的经常会需要ajax跨域的问题,通常的需求使用jsonp就可以得到解决,但是当前项目中有一个图片服务器,客户端需 ...

  6. Javascript 缓冲运动——逐行分析代码,让你轻松了解缓冲运动的原理

    看过上一篇关于Javascript 匀速运动文章的朋友相信对于运动已经有了初步的了解 接下来 讲一下关于缓冲运动的原理 ,我会逐行分析代码,代码简单易懂,能马上理解其中的原理,适用于初学者. #div ...

  7. mysql函数操作(2)

    <?php $dbh = new PDO('mysql:dbname=testdb;host=localhost', 'mysql_user', 'mysql_pwd'); $dbh->s ...

  8. C#控件、窗体置顶

    //控件置于顶层和底层 panel.BringToFront();//置于顶层 panel.SendToBack();//置于底层 //窗体置顶 TopMost = true;

  9. Linux下安装QT和OpenGL后QT无法使用OpenGL的解决方法

    我的系统为Ubuntu14.04,用apt-get安装了实现了OpenGl的mesa,QT则是用官网下载的run文件来安装的. 好了,现在两个都分别有了,所以要在qt下尝试写OpenGl代码. 之前试 ...

  10. MVC4,MVC3,VS2012+ entity framework Migration from Sqlserver to Mysql

    在开发的初期个人认为因VS与Sqlserver的配合很默契,即可以方便的实现Code First,又可以使用SqlServer Manager很漂亮的进行建模与变更,也许是个人的使用习惯MS的界面做的 ...