【bzoj3295】[Cqoi2011]动态逆序对

2014年6月17日4,7954

Description

对于序列A,它的逆序对数定义为满足i<j,且Ai>Aj的数对(i,j)的个数。给1到n的一个排列,按照某种顺序依次删除m个元素,你的任务是在每次删除一个元素之前统计整个序列的逆序对数。

Input

输入第一行包含两个整数nm,即初始元素的个数和删除的元素个数。以下n行每行包含一个1到n之间的正整数,即初始排列。以下m行每行一个正整数,依次为每次删除的元素。

Output

输出包含m行,依次为删除每个元素之前,逆序对的个数。

Sample Input

5 4
1
5
3
4
2
5
1
4
2

Sample Output

5
2
2
1
样例解释
(1,5,3,4,2)(1,3,4,2)(3,4,2)(3,2)(3)。

HINT

N<=100000 M<=50000

题解:

    这道动态逆序对问题和普通逆序对问题有什么区别,发现动态逆序对的每个值还有一个时间影响

    普通逆序对只有两个元素是二维偏序问题,一维是位置,一维是键值。

    而这里就是三维偏序问题,我们应该怎么来安排可以最方便呢?

    我是这样安排的,a,b,c分别表示时间,位置,键值,分别排序+cdq+树状数组,这样来搞

    在对于键值中,有点技巧,应为位置可能在前或者在后面,所以两次树状数组维护才行。

    最后用前缀和的思想。

  1. #include<cstring>
  2. #include<cmath>
  3. #include<algorithm>
  4. #include<iostream>
  5. #include<cstdio>
  6.  
  7. #define N 100007
  8. using namespace std;
  9. inline int read()
  10. {
  11. int x=,f=;char ch=getchar();
  12. while(ch<''||ch>''){if (ch=='-')f=-;ch=getchar();}
  13. while(ch>=''&&ch<=''){x=(x<<)+(x<<)+ch-'';ch=getchar();}
  14. return x*f;
  15. }
  16.  
  17. int n,m,tr[N];
  18. long long ans[N];
  19. struct Node
  20. {
  21. int a,b,c,ans;
  22. }a[N];
  23.  
  24. bool cmp1(Node x,Node y)
  25. {
  26. if (x.a==y.a&&x.b==y.b) return x.c>y.c;
  27. if (x.a==y.a) return x.b<y.b;
  28. return x.a<y.a;
  29. }
  30. bool cmp2(Node x,Node y)
  31. {
  32. return x.b<y.b;
  33. }
  34. bool cmp3(Node x,Node y)
  35. {
  36. return x.b>y.b;
  37. }
  38. int lowbit(int x){return x&(-x);}
  39. void update(int x,int num)
  40. {
  41. for (int i=x;i<=n;i+=lowbit(i))
  42. tr[i]+=num;
  43. }
  44. int query(int x)
  45. {
  46. int res=;
  47. for (int i=x;i>=;i-=lowbit(i))
  48. res+=tr[i];
  49. return res;
  50. }
  51. void cdq(int l,int r)
  52. {
  53. if (l==r) return;
  54. int mid=(l+r)>>;
  55. cdq(l,mid);
  56. cdq(mid+,r);
  57. sort(a+l,a+mid+,cmp2);
  58. sort(a+mid+,a+r+,cmp2);
  59. int i=l,j=mid+;
  60. while(j<=r)
  61. {
  62. while(i<=mid&&a[i].b<a[j].b)
  63. update(a[i].c,),i++;
  64. a[j].ans+=query(n)-query(a[j].c),j++;
  65. }
  66. for (int j=l;j<i;j++)
  67. update(a[j].c,-);
  68.  
  69. sort(a+l,a+mid+,cmp3);
  70. sort(a+mid+,a+r+,cmp3);
  71. i=l,j=mid+;
  72. while(j<=r)
  73. {
  74. while(i<=mid&&a[i].b>a[j].b)
  75. update(a[i].c,),i++;
  76. a[j].ans+=query(a[j].c),j++;
  77. }
  78. for (int j=l;j<i;j++)
  79. update(a[j].c,-);
  80. }
  81. int main()
  82. {
  83. n=read(),m=read();
  84. for (int i=;i<=n;i++){int x=read();a[x].b=i;}
  85. for (int i=;i<=m;i++){int x=read();a[x].a=m-i+;}//倒着表示什么时候插入
  86. for (int i=;i<=n;i++)a[i].c=i;
  87. sort(a+,a+n+,cmp1);
  88. cdq(,n);
  89. for (int i=;i<=n;i++)
  90. ans[a[i].a]+=a[i].ans;
  91. for (int i=;i<=m;i++)
  92. ans[i]+=ans[i-];
  93. for (int i=m;i>=;i--)
  94. printf("%lld\n",ans[i]);
  95. }

bzoj3295 [Cqoi2011]动态逆序对 cdq+树状数组的更多相关文章

  1. BZOJ3295: [Cqoi2011]动态逆序对(树状数组套主席树)

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

  2. BZOJ3295 [Cqoi2011]动态逆序对 分治 树状数组

    原文链接http://www.cnblogs.com/zhouzhendong/p/8678185.html 题目传送门 - BZOJ3295 题意 对于序列$A$,它的逆序对数定义为满足$i< ...

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

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

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

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

  5. bzoj3295: [Cqoi2011]动态逆序对(cdq分治+树状数组)

    3295: [Cqoi2011]动态逆序对 题目:传送门 题解: 刚学完cdq分治,想起来之前有一道是树套树的题目可以用cdq分治来做...尝试一波 还是太弱了...想到了要做两次cdq...然后伏地 ...

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

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

  7. BZOJ3295 动态逆序对(树状数组套线段树)

    [Cqoi2011]动态逆序对 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 6058  Solved: 2117[Submit][Status][D ...

  8. BZOJ3295 [Cqoi2011]动态逆序对 —— CDQ分治

    题目链接:https://vjudge.net/problem/HYSBZ-3295 3295: [Cqoi2011]动态逆序对 Time Limit: 10 Sec  Memory Limit: 1 ...

  9. bzoj3295: [Cqoi2011]动态逆序对(树套树)

    #include <iostream> #include <cstdio> #include <cstring> #include <cmath> #i ...

随机推荐

  1. DB2:在缓冲池 "1" 中当前没有任何页面可用。. SQLCODE=-1218, SQLSTATE=57011, DRIVER=3.61.75

    服务器端DB2数据库最近频繁报错: 在缓冲池 , SQLSTATE=, DRIVER= 试验发现简单的查询SQL执行没有问题,复杂的SQL就会报上述错误. 百度发现是因为数据库bufferpool太小 ...

  2. shell脚本中定义路径变量出现的BUG

    =========================================================================== if 语句中的定义路径变量 引发命令的PATH路 ...

  3. laravel 学习

    解决办法:没有开启PHP.ini的fileinfo扩展

  4. (1)《Head First HTML与CSS》学习笔记---HTML基本概念

    前言: 1.     这本书并没有面面俱到,涵盖所有内容,只提供作为初学者真正需要的东西:基本知识和信心.所以这不是唯一的参考书.(我买了一本<HTML5权威指南>作为参考书和这本一起看, ...

  5. jsdk之微信分享流程

    .步骤一:绑定域名 先登录微信公众平台进入“公众号设置”的“功能设置”里填写“JS接口安全域名”. 备注:登录后可在“开发者中心”查看对应的接口权限. .步骤二:引入JS文件 在需要调用JS接口的页面 ...

  6. 本地连接批处理修改IP

    例子: 本地连接修改IP netsh interface ip delete dns "本地连接" addr=allnetsh interface ip add dns " ...

  7. 浅谈kernel的结构图及生成过程-----(1)

    当今,我们身边如此多的服务器,工作站都运行着linux,因此也有不少的朋友想了解linux内的核心机理.但是由于kernel过于庞大,以致让一些朋友望而却步.(我在大二的时候也有过此经历,当时看到一些 ...

  8. AIX 10201 HA RAC 安装+升级到10204

    1:查看系统版本 [rac1:root:/hacmp/hacmp5.4/ha5.4/installp/ppc] oslevel -s 6100-06-06-1140 lslpp -al bos.adt ...

  9. Java Web数据库篇之MySQL特性

    MySQL ExplainEXPLAIN 命令的输出内容大致如下: mysql> explain select * from user_info where id = 2\G********** ...

  10. [SQL]数据分析SQL笔试题

    SQL笔试题 1.请简单写出left join和join的用法区别(可举例说明): 2.求出订单表(order表)中每个客户(custid)的最近一次购买日期(要求:按custid降序排列,trans ...