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个元素,你的任务是在每次删除一个元素之前统计整个序列的逆序 ...
随机推荐
- day25 模块,sys, logging, json, pickle
Python之路,Day13 = Python基础13 sys模块 sys.argv 命令行参数List,第一个元素是程序本身路径 sys.exit(n) 退出程序,正常退出时exit(0) sy ...
- (转)[视频压制/转换技术] I帧 B帧 P帧 IDR帧 等帧用途详细说明
转:http://www.u2game.net/bbs/thread-46116-1-1.html 在视频压制.转换中,经常会看到:I帧 B帧 P帧 IDR帧 等名词,这里就是通用的解释一下这些帧的用 ...
- IntelliJ IDEA更换主题样式分享
原文地址:https://blog.csdn.net/liu865033503/article/details/79481785 .自定义主题样式网址:http://www.riaway.com/in ...
- 集中式日志分析平台 - ELK Stack - 安全解决方案 X-Pack
大数据之心 关注 0.6 2017.02.22 15:36* 字数 2158 阅读 16457评论 7喜欢 9 简介 X-Pack 已经作为 Elastic 公司单独的产品线,前身是 Shield, ...
- python 安装bs4
1, 下载地址https://www.crummy.com/software/BeautifulSoup/#Download ------------------------------------- ...
- 第九篇:Spring的applicationContext.xml配置总结
在前面的一篇日志中,记录了web.xml配置启动的顺序,web启动到监听器ContextLoaderListener时,开始加载spring的配置文件applicationContext.xml(通常 ...
- 继承关系中子类使用@Data注解问题
HashSet中使用@Data注解问题 平时习惯使用lombok工具,免去了我们写get.set方法之类的,当然了,我们使用@Data注解后,equals().hashCode().toString( ...
- Go前言
Go语言为并发而生 硬件制造商正在为处理器添加越来越多的内核以来提高性能.所有数据中心都在这些处理器上运行,今天的应用程序使用多个微服务来维护数据库连接,消息队列和维护缓存.所以,开发的软件和编程语言 ...
- 【颓废篇】人生苦短,我用python(一)
谁渴望来一场华(ang)丽(zang)的python交易! 最近突然产生了系统学习python的想法. 其实自从上次luogu冬日绘板dalao们都在写脚本就有这种想法了. 最近被计算几何势力干翻的我 ...
- Sightseeing Cows
Sightseeing Cows 给出一张图,点数为L,边数P,并给出边的边权\(\{b_i\}\),再给处每个点的点权,求一条起点和终点相同的路径,并使其点权之和除以边权之和最大,注意,路径中点权只 ...