传送门

解题思路

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 分治)的更多相关文章

  1. 洛谷 P3157 [CQOI2011]动态逆序对 | CDQ分治

    题目:https://www.luogu.org/problemnew/show/3157 题解: 1.对于静态的逆序对可以用树状数组做 2.我们为了方便可以把删除当成增加,可以化动为静 3.找到三维 ...

  2. P3157 [CQOI2011]动态逆序对 CDQ分治

    一道CDQ分治模板题简单来说,这道题是三维数点对于离线的二维数点,我们再熟悉不过:利用坐标的单调递增性,先按更坐标排序,再按纵坐标排序更新和查询时都直接调用纵坐标.实际上,我们是通过排序将二维中的一维 ...

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

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

  4. [BZOJ3295][Cqoi2011]动态逆序对 CDQ分治&树套树

    3295: [Cqoi2011]动态逆序对 Time Limit: 10 Sec  Memory Limit: 128 MB Description 对于序列A,它的逆序对数定义为满足i<j,且 ...

  5. 【BZOJ3295】[Cqoi2011]动态逆序对 cdq分治

    [BZOJ3295][Cqoi2011]动态逆序对 Description 对于序列A,它的逆序对数定义为满足i<j,且Ai>Aj的数对(i,j)的个数.给1到n的一个排列,按照某种顺序依 ...

  6. bzoj3295: [Cqoi2011]动态逆序对(cdq分治+树状数组)

    3295: [Cqoi2011]动态逆序对 题目:传送门 题解: 刚学完cdq分治,想起来之前有一道是树套树的题目可以用cdq分治来做...尝试一波 还是太弱了...想到了要做两次cdq...然后伏地 ...

  7. BZOJ3295 [Cqoi2011]动态逆序对 —— CDQ分治

    题目链接:https://vjudge.net/problem/HYSBZ-3295 3295: [Cqoi2011]动态逆序对 Time Limit: 10 Sec  Memory Limit: 1 ...

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

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

  9. luogu P3157 [CQOI2011]动态逆序对(CDQ分治)

    题目描述 对于序列A,它的逆序对数定义为满足i<j,且Ai>Aj的数对(i,j)的个数.给1到n的一个排列,按照某种顺序依次删除m个元素,你的任务是在每次删除一个元素之前统计整个序列的逆序 ...

随机推荐

  1. 计算几何——圆卡精度cf1059D

    double 在1e17以后就不能顾及小数,所以用一下加精度的技巧 sqrt(r*r-d*d)=sqrt(r+d)*sqrt(r-d) 遇到误差在几位以内的注意要修改二分的精度,用最大的数据去乘以精度 ...

  2. Vue+Iview+Node 登录demo

    1.相关组件安装 axios  iview  js-cookie  crypto-js 2.子父组件传值.监听窗体大小改变.记住密码 .自定义组件(事件 .props) created:实例已经创建完 ...

  3. Android问题集锦An error occurred while automatically activating bundle com.android.ide.eclipse.adt .

    这是Eclipse的问题,重启之后问题依旧. 在坛子里找到这个办法,果然好用. 命令行到eclipse路径运行:eclipse.exe -clean

  4. csv文件格式

    弱渣今天第一次读Kaggle入门文章,知道train data,test data以及提供的result文件大都是以csv文件格式给出的. csv,全称 Comma-Separated Values, ...

  5. (20)Oracle函数

    substr 截取字段 substr(字符串,截取开始位置,截取长度) substr(str,n,m) 第二,三参数可以省略, 第二个参数为负数时表示从倒数第n位开始向后截取m个 round(str, ...

  6. 全局CSS设置

    全局CSS设置 1.清除所有的标记的内外边距 body,ul,li,a,img,p,input{ margin:0; padding:0; } 2.去除项目符号或编号前面的符号 ul,ol,li{ l ...

  7. C#winform datagridview单元格的单击处理

    首先看看效果图: 需求:要求是的在datagridview里面绑定数据后,可以任意点击想要点击的某列的单元格进行改变数据.需要在datagridview里面写3个事件 1.RowPrePaint事件: ...

  8. ELK5.2+kafka+zookeeper+filebeat集群部署

    架构图 考虑到日志系统的可扩展性以及目前的资源(部分功能复用),整个ELK架构如下: 架构解读 : (整个架构从左到右,总共分为5层) 第一层.数据采集层 最左边的是业务服务器集群,上面安装了file ...

  9. 0818NOIP模拟测试赛后总结

    又挂了…… 120 rank19. 第一次两个机房考不同的题目.一开始并不知道应该做哪套题目. 不明真相的吃瓜群众决定先点开B套.通读三道题,只是觉得T2好水.似乎是红题难度吧……(后来证明是我读错题 ...

  10. 前端CSS样式操作

    目录 字体和文字 设置标签的宽高 字体属性 文字的属性 文字对齐 text-align 文字装饰 text-decoration 首行缩进 text-indent 背景属性 背景图片 边框 画圆 di ...