先算出一个点前头比它大和后头比它小的数量。

每次删点就扔进一个主席树里头,防止造成重复删答案。

  1. #include <iostream>
  2. #include <cstring>
  3. #include <cstdio>
  4. using namespace std;
  5. int n, m, a[100005], p[100005], c[100005], uu, pre[100005], suf[100005];
  6. int lson[5000005], rson[5000005], sum[5000005], orz, rot[100005];
  7. long long ans;
  8. int lowbit(int x){
  9. return x&-x;
  10. }
  11. int getSum(int x){
  12. int tmp=0;
  13. for(int i=x; i; i-=lowbit(i)) tmp += c[i];
  14. return tmp;
  15. }
  16. int query(int o, int l, int r, int x, int y){
  17. if(!o) return 0;
  18. if(l>=x && r<=y) return sum[o];
  19. else{
  20. int mid=(l+r)>>1;
  21. int ans=0;
  22. if(x<=mid) ans += query(lson[o], l, mid, x, y);
  23. if(mid<y) ans += query(rson[o], mid+1, r, x, y);
  24. return ans;
  25. }
  26. }
  27. int queryRange(int uu, int vv, int xx, int yy){//在uu到vv之间有多少数在xx和yy之间
  28. int tmp=0;
  29. for(int i=uu-1; i; i-=lowbit(i))
  30. tmp -= query(rot[i], 1, n, xx, yy);
  31. for(int i=vv; i; i-=lowbit(i))
  32. tmp += query(rot[i], 1, n, xx, yy);
  33. return tmp;
  34. }
  35. void update(int &rt, int l, int r, int x){
  36. if(!rt) rt = ++orz;
  37. sum[rt]++;
  38. if(l==r) return ;
  39. int mid=(l+r)>>1;
  40. if(x<=mid) update(lson[rt], l, mid, x);
  41. if(mid<x) update(rson[rt], mid+1, r, x);
  42. }
  43. int main(){
  44. cin>>n>>m;
  45. for(int i=1; i<=n; i++){
  46. scanf("%d", &a[i]);
  47. p[a[i]] = i;
  48. pre[i] = getSum(n) - getSum(a[i]);
  49. ans += pre[i];
  50. for(int j=a[i]; j<=n; j+=lowbit(j)) c[j]++;
  51. }
  52. memset(c, 0, sizeof(c));
  53. for(int i=n; i; i--){
  54. suf[i] = getSum(a[i]-1);
  55. for(int j=a[i]; j<=n; j+=lowbit(j)) c[j]++;
  56. }
  57. while(m--){
  58. printf("%lld\n", ans);
  59. scanf("%d", &uu);
  60. uu = p[uu];
  61. ans -= pre[uu] + suf[uu];
  62. ans += queryRange(1, uu-1, a[uu]+1, n);
  63. ans += queryRange(uu+1, n, 1, a[uu]-1);
  64. for(int i=uu; i<=n; i+=lowbit(i))
  65. update(rot[i], 1, n, a[uu]);
  66. }
  67. return 0;
  68. }

luogu3157 [CQOI2011]动态逆序对的更多相关文章

  1. BZOJ3295/Luogu3157 [CQOI2011]动态逆序对 (CDQ or 树套树 )

    /* Dear friend, wanna learn CDQ? As a surprice, this code is totally wrong. You may ask, then why yo ...

  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. bzoj3295[Cqoi2011]动态逆序对 树套树

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

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

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

  6. P3157 [CQOI2011]动态逆序对

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

  7. 2018.07.01 BZOJ3295: [Cqoi2011]动态逆序对(带修主席树)

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

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

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

  9. bzoj千题计划146:bzoj3295: [Cqoi2011]动态逆序对

    http://www.lydsy.com/JudgeOnline/problem.php?id=3295 正着删除看做倒着添加 对答案有贡献的数对满足以下3个条件: 出现时间:i<=j 权值大小 ...

随机推荐

  1. Android课程设计第四天ListView运用

    注意:课程设计只为完成任务,不做细节描述~ 效果图 <?xml version="1.0" encoding="utf-8"?> <Relat ...

  2. Bank Hacking CodeForces - 796C

    题目 题意: 一条笨狗要去黑银行,银行有n个,它们之间用n-1条边连接.可以选择任意一个银行开始黑,但是后面每一次黑的银行都要求与已经黑过的银行直接相连.每个银行初始有一个防御值,每一个银行被黑后,与 ...

  3. bash 变量传递方法

    ###1.sh    ##(该sh 目的是 将变量env传入env.sh, 同时让env.sh在当前事物生效,最后执行env.sh 定义的变量envs) export ENV=prepareecho ...

  4. 146 LRU Cache 最近最少使用页面置换算法

    设计和实现一个  LRU(最近最少使用)缓存 数据结构,使它应该支持以下操作: get 和 put .get(key) - 如果密钥存在于缓存中,则获取密钥的值(总是正数),否则返回 -1.put(k ...

  5. 在线编译器Coding Ground

    http://www.tutorialspoint.com/codingground.htm Free Online IDE and Terminal - Edit, Compile, Execute ...

  6. C#中Json的简单处理

    命名空间:Windows.Data.Json在Windows Runtime中,可以使用Json类对获取的Json字符串进行操作,相比DataContractJsonSerializer类操作更加直观 ...

  7. VB.NET入门 ANDALSO 和OrElse 之于 AND,OR

    Module Module1 Sub Main() Dim x As Integer = 8, y As Integer = 5, z As Integer = 3 Console.WriteLine ...

  8. 通俗易懂的Nhibernate教程(1) ----- 基本操作,映射,CURD

    网站架构: 1.图片 2.说明 Data  -----------------------   类库项目,数据访问层,由Nhibernate提供数据相关操作 Mapping ------------- ...

  9. PKU_campus_2017_K Lying Island

    思路: 题目链接http://poj.openjudge.cn/practice/C17K/ 状压dp.dp[i][j]表示第i - k人到第i人的状态为j的情况下前i人中最多有多少好人. 实现: # ...

  10. 【学习笔记】C++文件操作详解(ifstream、ofstream、fstream)

    C++ 通过以下几个类支持文件的输入输出: ofstream: 写操作(输出)的文件类 (由ostream引申而来) ifstream: 读操作(输入)的文件类(由istream引申而来) fstre ...