我怎么控制不住自己又写了个数据结构啊……真是的……

其实我是想练CDQ分治的……结果忍不住又写了个主席树。

首先看看不动态的逆序对咋做?树状数组嘛。

那么删除咋搞?就是考虑贡献,把它前面比他大的,后面比他小的减去……

诶?带修改主席树?我……我好像才写过……?

 1 #include<bits/stdc++.h>
 2 #define inf 0x7fffffff
 3 #define N 100005
 4 #define M 5000005
 5 using namespace std;
 6 typedef long long ll;
 7 ll ans;
 8 int n,m,sz,a[100],b[100],val[N],pos[N],a1[N],a2[N];
 9 int c[N*10],rt[N],ls[M],rs[M],sumv[M];
10 inline int lowbit(int x){return x&(-x);}
11 inline int ask(int x){
12     int ans=0;
13     for(int i=x;i;i-=lowbit(i))ans+=c[i];
14     return ans;
15 }
16 void change(int &o,int l,int r,int q){
17     if(!o)o=++sz;sumv[o]++;
18     if(l==r)return;
19     int mid=(l+r)>>1;
20     if(q<=mid)change(ls[o],l,mid,q);
21     else change(rs[o],mid+1,r,q);
22 }
23 int querysub(int x,int y,int v){
24     int cnta=0,cntb=0;int ans=0;x--;
25     for(int i=x;i;i-=lowbit(i))a[++cnta]=rt[i];
26     for(int i=y;i;i-=lowbit(i))b[++cntb]=rt[i];
27     int l=1,r=n;
28     while(l!=r){
29         int mid=(l+r)>>1;
30         if(v<=mid){
31             for(int i=1;i<=cnta;i++)ans-=sumv[rs[a[i]]];
32             for(int i=1;i<=cntb;i++)ans+=sumv[rs[b[i]]];
33             for(int i=1;i<=cnta;i++)a[i]=ls[a[i]];
34             for(int i=1;i<=cntb;i++)b[i]=ls[b[i]];
35             r=mid;
36         }
37         else{
38             for(int i=1;i<=cnta;i++)a[i]=rs[a[i]];
39             for(int i=1;i<=cntb;i++)b[i]=rs[b[i]];
40             l=mid+1;
41         }
42     }
43     return ans;
44 }
45 int querypre(int x,int y,int v){
46     int cnta=0,cntb=0,ans=0;x--;
47     for(int i=x;i;i-=lowbit(i))a[++cnta]=rt[i];
48     for(int i=y;i;i-=lowbit(i))b[++cntb]=rt[i];
49     int l=1,r=n;
50     while(l!=r){
51         int mid=(l+r)>>1;
52         if(v>mid){
53             for(int i=1;i<=cnta;i++)ans-=sumv[ls[a[i]]];
54             for(int i=1;i<=cntb;i++)ans+=sumv[ls[b[i]]];
55             for(int i=1;i<=cnta;i++)a[i]=rs[a[i]];
56             for(int i=1;i<=cntb;i++)b[i]=rs[b[i]];
57             l=mid+1;
58         }
59         else{
60             for(int i=1;i<=cnta;i++)a[i]=ls[a[i]];
61             for(int i=1;i<=cntb;i++)b[i]=ls[b[i]];
62             r=mid;
63         }
64     }
65     return ans;
66 }
67 inline int read(){
68     int f=1,x=0;char ch;
69     do{ch=getchar();if(ch=='-')f=-1;}while(ch<'0'||ch>'9');
70     do{x=x*10+ch-'0';ch=getchar();}while(ch>='0'&&ch<='9');
71     return f*x;
72 }
73 int main(){
74     n=read();m=read();
75     for(int i=1;i<=n;i++){
76         val[i]=read();pos[val[i]]=i;
77         a1[i]=ask(n)-ask(val[i]);
78         ans+=a1[i];
79         for(int j=val[i];j<=n;j+=lowbit(j))c[j]++;
80     }
81     memset(c,0,sizeof(c));
82     for(int i=n;i;i--){
83         a2[i]=ask(val[i]-1);
84         for(int j=val[i];j<=n;j+=lowbit(j))c[j]++;
85     }
86     for(int i=1;i<=m;i++){
87         printf("%lld\n",ans);
88         int x=read();x=pos[x];
89         ans-=(a1[x]+a2[x]-querysub(1,x-1,val[x])-querypre(x+1,n,val[x]));
90         for(int j=x;j<=n;j+=lowbit(j))change(rt[j],1,n,val[x]);
91     }
92     return 0;
93 }

View Code

感觉在写数据结构就要数据结构上瘾综合症了。

业界俗称 数据结构学傻

顺便纪念一下bzoj200AC。

转载于:https://www.cnblogs.com/zcysky/p/6842774.html

【bzoj3295】动态逆序对相关推荐

  1. P3157 [CQOI2011]动态逆序对 (CDQ解决三维偏序问题)

    P3157 [CQOI2011]动态逆序对 题目描述 对于序列A,它的逆序对数定义为满足i<j,且Ai>Aj的数对(i,j)的个数.给1到n的一个排列,按照某种顺序依次删除m个元素,你的任 ...

  2. 【Luogu1393】动态逆序对(CDQ分治)

    [Luogu1393]动态逆序对(CDQ分治) 题面 题目描述 对于给定的一段正整数序列,我们定义它的逆序对的个数为序列中ai>aj且i < j的有序对(i,j)的个数.你需要计算出一个序 ...

  3. HYSBZ - 3295  动态逆序对 (cdq分治)

    F - 动态逆序对 HYSBZ - 3295 题目大意:给出一个序列有m个询问,每一个询问要求输出当前的逆序对数量后在原序列中删除该数字. 解题思路:如果将删除倒着做就变成了插入.没插入一个数字我们就 ...

  4. [Luogu P3157][CQOI2011]动态逆序对 (树套树)

    题面 传送门:[CQOI2011]动态逆序对 Solution 一开始我看到pty巨神写这套题的时候,第一眼还以为是个SB题:这不直接开倒车线段树统计就完成了吗? 然后冷静思考了一分钟,猛然发现单纯的 ...

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

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

  6. bzoj3295:[CQOI2011]动态逆序对

    传送门 线段树套线段树会TLE+MLE! 树状数组不仅空间小,常数也小(我写的除外) 思考一下求逆序对需要的条件,树套树就过了 代码: #include<cstdio> #include& ...

  7. P3157 动态逆序对 ,树状数组套动态开点线段树

    题目 洛谷题目链接 题解 在求整体的逆序对的数量时,很好办,直接用树状数组处理即可,不过在这时,我们还需要处理出一个数组pa[]pa[]pa[],其中pa[i]pa[i]pa[i]代表在区间[1,i) ...

  8. UVA 11990 ``Dynamic'' Inversion 动态逆序对

    ``Dynamic'' Inversion Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 https://uva.onlinejudge.org/index ...

  9. uva11990 动态逆序对

    这题说的是给了一个数组,按照他给的顺序依次删除数,在删除之前输出此时的逆序对个数 我们用Fenwick树 维护这整个数列, C[i]是一个 treap的头, 管理了在树状数组中 能影响他的点,然后我们 ...

最新文章

  1. 跨域请求的一种解决方案
  2. linux目录空间内存,Linux 目录结构:内存文件夹
  3. Paper:关于人工智能的所有国际顶级学术会简介(IJCAI、ICLR、AAAI 、COLT、CVPR、ICCV 等)之详细攻略(持续更新,建议收藏!)
  4. [CQOI2012]交换棋子【网络流】【费用流】
  5. 测试用例设计--判定表
  6. PAT:1013. 数素数 (20) AC
  7. 自动驾驶 10-1: 3D 几何和参考系3D Geometry and Reference Frames
  8. The7 v.10.2.0-中文汉化主题/可视化拖拽编辑的WordPress主题企业外贸商城网站模板
  9. Sass Module 介绍
  10. 积分大比拼,哪家银行信用卡积分最值钱?
  11. table中tr:hover无效 td:hover有效
  12. nginx: [emerg] unknown directive “锘? in******
  13. js md5加密 无法md5解密
  14. Spectral–spatial hyperspectral image classification
  15. kaggle 收不到手机验证码
  16. 用过Retina视网膜屏幕的笔记本电脑的后果
  17. 关于left / right / stereo / mono
  18. 不写代码也能实现android应用
  19. Build RESTful APIs with Spring MVC
  20. 【java毕业设计】基于javaEE+原生Servlet+MySql的Web停车场管理系统设计与实现(毕业论文+程序源码)——停车场管理系统

热门文章

  1. 成都java培训一般需要多久
  2. E-R图画法解析----概念模型的一种表示方法
  3. 亚马逊后台操作不容措施旺季~~~~~~
  4. 从十亿光年到0.1飞米:从宇宙到细胞,从宏观到微观
  5. 玩转华为ENSP模拟器系列 | 配置LDP自动触发DoD请求功能示例
  6. 当初的愿望实现了么? .
  7. 软件开发质量改进措施_改进可能是软件开发人员面临的最大挑战,因此我们该如何做...
  8. 不能打印机与计算机,电脑打印机无法打印
  9. LBS基站定位和GPS卫星定位对比
  10. Sublime Text 3 Build 3065 All System CracKed By Hmily[LCG]