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个元素,你的任务是在每次删除一个元素之前统计整个序列的逆序 ...
随机推荐
- luoguP1890 gcd区间 [st表][gcd]
题目描述 给定一行n个正整数a[1]..a[n]. m次询问,每次询问给定一个区间[L,R],输出a[L]..a[R]的最大公因数. 输入输出格式 输入格式: 第一行两个整数n,m. 第二行n个整数表 ...
- 0908CSP-S模拟测试赛后总结
我早就料到昨天会考两场2333 话说老师终于给模拟赛改名了啊. 距离NOIP祭日还有60天hhh. 以上是废话. %%%DeepinC无敌神 -rank1 zkt神.kx神.动动神 -rank2 有钱 ...
- java基本类型映射表
- How to Hide Apache Tomcat Version Number from Error Pages
1. 进入tomcat lib目录 cd /usr/local/tomcat7/lib 2. 解压catalina.jar jar xvf catalina.jar 3. 修改ServerInfo.p ...
- 杂项-日志:日志(log)
ylbtech-杂项-日志:日志(log) 1.返回顶部 1. 概述 网络设备.系统及服务程序等,在运作时都会产生一个叫log的事件记录:每一行日志都记载着日期.时间.使用者及动作等相关操作的描述. ...
- CygWin、MinGw和Msys的区别
做了6年的Windows C++,觉得已经没什么挑战力:而且Windows C++已经没落,不得不转Linux C++: 习惯了Windows的界面,习惯了傻瓜式的VS IDE,现在遇到Linux命令 ...
- 学SpringBoot一篇就够了
1.SpringBoot概述 Spring 框架对于很多 Java 开发人员来说都不陌生.自从 2002 年发布以来,Spring 框架已经成为企业应用开发领域非常流行的基础框架.有大量的企业应用基于 ...
- RunLoop运行循环机制
http://www.jianshu.com/p/0be6be50e461 基本概念 进程 进程是指在系统中正在运行的一个应用程序,而且每个进程之间是独立的,它们都运行在其专用且受保护的内存空间内,比 ...
- Mybatis-generator/通用Mapper/Mybatis-Plus对比
mybatis-plus-boot-starter和mybatis-spring-boot-starter冲突导致MapperScan失效问题还没有解决,只能不用mybatis-plus-boot-s ...
- selenium学习笔记11——driver.get(url) 页面加载时间太长
在执行自动化测试用例过程中,发现因为网络慢或其他原因导致driver.get(url) 时,页面一直在加载,页面没有加载完成就不会去继续执行下面的动作,但是实际上需要操作的元素已经加载出来了. 解决方 ...