LUOGU P3157 [CQOI2011]动态逆序对(CDQ 分治)
解题思路
cdq分治,将位置看做一维,修改时间看做一维,权值看做一维,然后就转化成了三维偏序,用排序+cdq+树状数组。注意算删除贡献时要做两次cdq,分别算对前面和后面的贡献。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm> using namespace std;
const int MAXN = ;
const int MAXM = ;
const int MAXQ = MAXN+MAXM;
typedef long long LL; inline int rd(){
int x=,f=;char ch=getchar();
while(!isdigit(ch)) {f=ch=='-'?:;ch=getchar();}
while(isdigit(ch)) {x=(x<<)+(x<<)+ch-'';ch=getchar();}
return f?x:-x;
} LL ans,f[MAXN];
int n,m,now; struct Query{
int t,pos,id,a;
LL pre,nxt;
}q[MAXN],tmp[MAXN]; void add(int x,int y){
for(;x<=n;x+=x&-x) f[x]+=y;
} LL query(int x){
LL ret=;
for(;x;x-=x&-x) ret+=f[x];
return ret;
} void Clear(int x){
for(;x<=n;x+=x&-x) f[x]=;
} inline bool cmp(Query A,Query B){
return A.a>B.a;
} inline bool _cmp(Query A,Query B){
return A.a<B.a;
} inline bool cmp_(Query A,Query B){
return A.pos<B.pos;
} inline bool cmp1(Query A,Query B){
return A.t>B.t;
} inline bool cmp2(Query A,Query B){
return A.t<B.t;
} void cdq(int l,int r){
if(l==r) return;
int mid=l+r>>;cdq(l,mid);cdq(mid+,r);
int L=l,R=mid+,o=;
while(L<=mid && R<=r){
if(q[L].pos>q[R].pos){
add(q[L].a,);
tmp[++o]=q[L++];
}
else{
q[R].pre+=query(q[R].a);
tmp[++o]=q[R++];
}
}
while(L<=mid) tmp[++o]=q[L++];
while(R<=r){
q[R].pre+=query(q[R].a);
tmp[++o]=q[R++];
}
for(register int i=l;i<=mid;i++) Clear(q[i].a);
for(register int i=;i<=o;i++) q[i+l-]=tmp[i];
} void CDQ(int l,int r){
if(l==r) return;
int mid=l+r>>;CDQ(l,mid);CDQ(mid+,r);
int L=l,R=mid+,o=;
while(L<=mid && R<=r){
if(q[L].a>q[R].a){
add(q[L].pos,);
tmp[++o]=q[L++];
}
else{
q[R].nxt+=query(q[R].pos);
tmp[++o]=q[R++];
}
}
while(L<=mid) tmp[++o]=q[L++];
while(R<=r){
q[R].nxt+=query(q[R].pos);
tmp[++o]=q[R++];
}
for(register int i=l;i<=mid;i++) Clear(q[i].pos);
for(register int i=;i<=o;i++) q[i+l-]=tmp[i];
} int main(){
n=rd(),m=rd();int x;
for(int i=;i<=n;i++)
q[i].a=rd(),q[i].pos=i;
sort(q+,q++n,cmp);
for(int i=;i<=n;i++) {
add(q[i].pos,);
ans+=query(q[i].pos-);
}
for(int i=;i<=n;i++) add(q[i].pos,-);
sort(q+,q++n,_cmp);
// for(int i=1;i<=n;i++) cout<<q[i].pos<<" ";
// cout<<ans<<endl;
for(int i=;i<=m;i++) q[rd()].t=i;
sort(q+,q++n,cmp_);
for(int i=;i<=n;i++) if(q[i].t==) q[i].t=++now+m;
sort(q+,q++n,cmp1);
cdq(,n);
sort(q+,q++n,cmp1);
CDQ(,n);
sort(q+,q++n,cmp2);
for(int i=;i<=m;i++) {
printf("%lld\n",ans);
ans-=q[i].pre+q[i].nxt;
}
return ;
}
LUOGU P3157 [CQOI2011]动态逆序对(CDQ 分治)的更多相关文章
- 洛谷 P3157 [CQOI2011]动态逆序对 | CDQ分治
题目:https://www.luogu.org/problemnew/show/3157 题解: 1.对于静态的逆序对可以用树状数组做 2.我们为了方便可以把删除当成增加,可以化动为静 3.找到三维 ...
- P3157 [CQOI2011]动态逆序对 CDQ分治
一道CDQ分治模板题简单来说,这道题是三维数点对于离线的二维数点,我们再熟悉不过:利用坐标的单调递增性,先按更坐标排序,再按纵坐标排序更新和查询时都直接调用纵坐标.实际上,我们是通过排序将二维中的一维 ...
- P3157 [CQOI2011]动态逆序对 (CDQ解决三维偏序问题)
P3157 [CQOI2011]动态逆序对 题目描述 对于序列A,它的逆序对数定义为满足i<j,且Ai>Aj的数对(i,j)的个数.给1到n的一个排列,按照某种顺序依次删除m个元素,你的任 ...
- [BZOJ3295][Cqoi2011]动态逆序对 CDQ分治&树套树
3295: [Cqoi2011]动态逆序对 Time Limit: 10 Sec Memory Limit: 128 MB Description 对于序列A,它的逆序对数定义为满足i<j,且 ...
- 【BZOJ3295】[Cqoi2011]动态逆序对 cdq分治
[BZOJ3295][Cqoi2011]动态逆序对 Description 对于序列A,它的逆序对数定义为满足i<j,且Ai>Aj的数对(i,j)的个数.给1到n的一个排列,按照某种顺序依 ...
- bzoj3295: [Cqoi2011]动态逆序对(cdq分治+树状数组)
3295: [Cqoi2011]动态逆序对 题目:传送门 题解: 刚学完cdq分治,想起来之前有一道是树套树的题目可以用cdq分治来做...尝试一波 还是太弱了...想到了要做两次cdq...然后伏地 ...
- BZOJ3295 [Cqoi2011]动态逆序对 —— CDQ分治
题目链接:https://vjudge.net/problem/HYSBZ-3295 3295: [Cqoi2011]动态逆序对 Time Limit: 10 Sec Memory Limit: 1 ...
- [Luogu P3157][CQOI2011]动态逆序对 (树套树)
题面 传送门:[CQOI2011]动态逆序对 Solution 一开始我看到pty巨神写这套题的时候,第一眼还以为是个SB题:这不直接开倒车线段树统计就完成了吗? 然后冷静思考了一分钟,猛然发现单纯的 ...
- luogu P3157 [CQOI2011]动态逆序对(CDQ分治)
题目描述 对于序列A,它的逆序对数定义为满足i<j,且Ai>Aj的数对(i,j)的个数.给1到n的一个排列,按照某种顺序依次删除m个元素,你的任务是在每次删除一个元素之前统计整个序列的逆序 ...
随机推荐
- poj 1742 Coins(二进制优化多重背包)
传送门 解题思路 多重背包,二进制优化.就是把每个物品拆分成一堆连续的\(2\)的幂加起来的形式,然后把最后剩下的也当成一个元素.直接类似\(0/1\)背包的跑就行了,时间复杂度\(O(nmlogc) ...
- webstorm 初次上传代码到 远程gitlab中
1. 在 公司搭建的gitlab网站,创建project,然后生成了 git的地址. 2.在 本地电脑上,打开 webstorm,要将已有的代码上传到 git网站,那么需要在webstrom编辑器的t ...
- redis:info详解
[root@192.168.56.159 redis6380]redis-cli -a xxx info# Serverredis_version:3.0.7 redis_version: Redi ...
- VS2010-MFC(常用控件:树形控件Tree Control 上)
转自:http://www.jizhuomi.com/software/200.html 前面两节讲了列表视图控件List Control,这一节开始介绍一种特殊的列表--树形控件Tree Contr ...
- Entityframwork.extended 配置mysql
entityframework.extended 这个是个很好的扩展,不过由于默认是配置成MSSQL的,今天在github上面 看到一个解决方案,亲测可用,下面贴代码 1.在DbContext 修改默 ...
- JavaScript基础的一些小总结
一.js变量 1.变量声明: var 关键字来进行变量声明 变量是弱类型 1.数字 2.小数 3.boolean 4.字符串 4.字符 验证数据类型:1.整数,小数是numbe ...
- 机器学习-反向传播算法(BP)代码实现(matlab)
%% Machine Learning Online Class - Exercise 4 Neural Network Learning % Instructions % ------------ ...
- C++返回引用的需求
1.重载+=操作符返回*this或者某个参数的引用可以方便链式调用,比如C++流操作就是cout<< a << b << c这样的,就是靠不停返回stream的引用 ...
- CAS机制详解
目录 1. 定义 2. 实现原理 3. 无版本号CAS实战说明 4. CAS机制在Java中的应用 5. CAS的缺点 1. CPU开销过大 2. 不能保证代码块的原子性 3. ABA问题 6. JA ...
- JS完美运动框架【利用了Json】
<!doctype html> <html> <head> <meta charset="utf-8"> <title> ...