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个元素,你的任务是在每次删除一个元素之前统计整个序列的逆序 ...
随机推荐
- C++ 贪吃蛇二维
#include <iostream> #include <conio.h> #include <windows.h> #include <time.h> ...
- thinkphp 默认值输出
我们可以给变量输出提供默认值,例如: 大理石平台厂家 {$user.nickname|default="这家伙很懒,什么也没留下"} 对系统变量依然可以支持默认值输出,例如: {$ ...
- Ubuntu-WPS无法输入中文
WPS无法输入中文 原因:环境变量未正确设置 $ vi /usr/bin/wps,添加以下内容: #!/bin/bash export XMODIFIERS="@im=fcitx" ...
- Ubuntu 更新错误修复大全
合并列表问题 当你在终端中运行更新命令时,你可能会碰到这个错误“合并列表错误”,就像下面这样: E:Encountered a section with no Package: header, E:P ...
- (转)JNI入门教程之HelloWorld篇 .
转: http://blog.csdn.net/mingjava/article/details/180946 本文讲述如何使用JNI技术实现HelloWorld,目的是让读者熟悉JNI的机制并编写第 ...
- day23_3_configparse
#!/usr/bin/env python# -*- coding:utf-8 -*-# ------------------------------------------------------- ...
- zepto问题
jq功能对照表 http://jsrun.it/21f/mrCH 不支持 jquery的 ajaxSetup 全局修改ajax的设置 $.ajaxSetup({beforeSend : beforeS ...
- netty 解决粘包拆包问题
netty server TimeServer package com.zhaowb.netty.ch4_3; import io.netty.bootstrap.ServerBootstrap; i ...
- 记录redis安装及常用命令
Redis安装及常用命令 一.安装 1.下载,解压,进入redis解压目录,make. make PREFIX=目录/redis install :安装到指定目录文件名为redis. 2.将解压目录里 ...
- 【期望DP】[UVA1498] Activation
显然是概率DP 我们用dp[i][j]表示队伍中有i个人,lyk的小迷妹现在排在j这个位置时的概率大小 不难列出下列转移方程: (显然已经排到前面k个位置的时候是要加上爆炸也就是p4的概率的) $$f ...