【Luogu1393】动态逆序对(CDQ分治)

题面

题目描述

对于给定的一段正整数序列,我们定义它的逆序对的个数为序列中ai>aj且i < j的有序对(i,j)的个数。你需要计算出一个序列的逆序对组数及其删去其中的某个数的逆序对组数。

输入输出格式

输入格式:

第一行,两个数n,m,表示序列中有n个数,要删去m个数

第二行n个数,表示给定的序列。

第三行m个数,第i个数di表示要删去原序列中的第di个数。

输出格式:

一行m+1个数。第一个数表示给定序列的逆序对组数,第i+1个数表示删去第di个数后序列的逆序对组数(删去的数不再恢复)

输入输出样例

输入样例#1:

6 3
5 4 2 6 3 1
2 1 4

输出样例#1:

11 7 4 2

说明

对于20%的数据,n≤2500

对于另30%的数据,m=0

对于100%的数据,n≤40000,m≤n/2,且保证第二行n个数互不相同,第三行m个数互不相同

题解

之前不是说过要写一遍CDQ分治吗??
在这里说的
可是,当你把上面的代码兴高采烈的Copy到洛谷上之后
你就会直接WA了
因为,题目还是有点不同的(仔细读题)
区别一:这题不是排列,要离散化
区别二:这题删掉的不是数字,而是位置

好了回归正题,讲讲CDQ分治怎么写
首先,给所有删掉的数编个号,就按照删去的顺序来吧
没有删掉的数就编个INF吧

那么,删掉这个数之后,减少的逆序对对数是:
对于\(j\in[1,j]\)
\(t[i]<t[j]\),其中t是删除的编号
并且
\(i<j,a[i]>a[j]\)
或者
\(i>j,a[i]<a[j]\)
所以,删除的编号直接sort搞完
剩下的两维CDQ分治

于是,发现这个玩意是一个三维偏序
所以之前写过的树状数组套平衡树当然也可以做啦
但是,CDQ分治还是要会嗷。。

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<set>
#include<map>
#include<vector>
#include<queue>
using namespace std;
#define MAX 50000
inline int read()
{int x=0,t=1;char ch=getchar();while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();if(ch=='-')t=-1,ch=getchar();while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();return x*t;
}
int n,m,S[MAX],a[MAX],b[MAX],c[MAX],d[MAX];
long long ans;
int lowbit(int x){return x&(-x);}
void Add(int x,int w){while(x<=n)c[x]+=w,x+=lowbit(x);}
int getsum(int x){int ret=0;while(x)ret+=c[x],x-=lowbit(x);return ret;}
struct Node
{int t,p,a;int s;
}t[MAX];
bool operator<(Node a,Node b){return a.t<b.t;}
bool cmp(Node a,Node b){return a.p<b.p;}
void CDQ(int l,int r)
{if(l==r)return;int mid=(l+r)>>1;CDQ(l,mid);CDQ(mid+1,r);sort(&t[l],&t[mid+1],cmp);sort(&t[mid+1],&t[r+1],cmp);int j=mid;for(int i=l;i<=mid;++i){while(j<r&&t[j+1].p<t[i].p)++j,Add(t[j].a,1);t[i].s+=getsum(n)-getsum(t[i].a);}for(int i=mid+1;i<=j;++i)Add(t[i].a,-1);j=r+1;for(int i=mid;i>=l;--i){while(j>mid+1&&t[j-1].p>t[i].p)--j,Add(t[j].a,1);t[i].s+=getsum(t[i].a-1);}for(int i=r;i>=j;--i)Add(t[i].a,-1);
}
int main()
{n=read();m=read();for(int i=1;i<=n;++i)S[i]=a[i]=read();sort(&S[1],&S[n+1]);for(int i=1;i<=n;++i)b[a[i]=lower_bound(&S[1],&S[n+1],a[i])-S]=i;for(int i=n;i;i--)ans+=getsum(a[i]),Add(a[i],1);for(int i=1;i<=n;++i)t[i].t=n+1,t[i].p=i,t[i].a=a[i];for(int i=1;i<=m;++i){d[i]=read();t[d[i]].t=i;}sort(&t[1],&t[n+1]);memset(c,0,sizeof(c));CDQ(1,n);for(int i=1;i<=n;++i)c[t[i].p]=t[i].s;printf("%lld ",ans);for(int i=1;i<=m;++i)printf("%lld ",ans=ans-c[d[i]]);return 0;
}

转载于:https://www.cnblogs.com/cjyyb/p/8127824.html

【Luogu1393】动态逆序对(CDQ分治)相关推荐

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

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

  2. BZOJ 3295: [Cqoi2011]动态逆序对 cdq分治

    https://www.lydsy.com/JudgeOnline/problem.php?id=3295 这个妹妹我曾见过的~~~ 之前应该在校内oj写了,似乎还写过题解?发现没写博客就重新水一遍代 ...

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

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

  4. HYSBZ - 3295  动态逆序对 (cdq分治)

    F - 动态逆序对 HYSBZ - 3295 题目大意:给出一个序列有m个询问,每一个询问要求输出当前的逆序对数量后在原序列中删除该数字. 解题思路:如果将删除倒着做就变成了插入.没插入一个数字我们就 ...

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

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

  6. 【洛谷3157】[CQOI2011] 动态逆序对(CDQ分治)

    点此看题面 大致题意: 给你一个从\(1\)到\(n\)的排列,问你每次删去一个元素后剩余的逆序对个数. 关于\(80\)分的树套树 为了练树套树,我找到了这道题目. 但悲剧的是,我的 线段树套\(T ...

  7. P3157-[CQOI2011]动态逆序对【CDQ分治,树状数组】

    正题 题目链接:https://www.luogu.com.cn/problem/P3157 题目大意 一个长度为nnn序列,每次删除一个数,求删除前的逆序对数量. 解题思路 时光倒流之后,我们变为每 ...

  8. 【BZOJ3295】动态逆序对,CDQ分治/BIT套权值线段树

    传送门 思路: 用来练习cdq的题目 断断续续纠结了2天 因为loli一直在考试 最后莫名乱搞了一发就A了? 实际上是考虑每一次修改对答案的贡献,即位置在1~x-1且大于x的数以及位置在x+1~n且小 ...

  9. BZOJ3295 [Cqoi2011]动态逆序对 分治 树状数组

    原文链接http://www.cnblogs.com/zhouzhendong/p/8678185.html 题目传送门 - BZOJ3295 题意 对于序列$A$,它的逆序对数定义为满足$i< ...

最新文章

  1. python使用fpdf生成数据报告pdf文件
  2. 如何获得Java中泛型类的类型参数?
  3. asp.net mvc中用 log4net记录日志到数据库中
  4. json数据交换的例了
  5. linux 添加重定向域名,Linux系统中Nginx的安装并进行域名认证和重定向
  6. 残疾人软件开发_组织如何使残疾人更具包容性
  7. 【华为云技术分享】干货!!卷积神经网络之LeNet-5迁移实践案例
  8. GitHub GraphQL API已正式可用
  9. 新华三杯考前突击---Day4---综合篇
  10. 学生宿舍管理系统——UML 2nd
  11. 数据结构期末考题总结(附答案)
  12. 电脑正下方显示桌面和计算机,电脑桌面下方的显示栏怎么设置
  13. 腾讯云对象储存-图片上传-删除图片
  14. matlab中TCR触发,TCR+FC型SVC及MATLAB仿真.doc
  15. python上进行日期的儒略日换算
  16. 光猫可以直接接交换机吗 交换机能直接连光猫吗
  17. 免费LOGO在线生成
  18. oracle提示符sqlprompt
  19. win10不识别移动硬盘
  20. 深析超市商品管理系统设计

热门文章

  1. linux 模拟时序,stm32GPIO模拟时序读写nandflash(K9F1G08U0B)问题
  2. java三大特性 继承_java基础(二)-----java的三大特性之继承
  3. linux编译ffmpeg成so,「ffmpeg」一 mac 环境下编译ffmpeg,生成so库文件
  4. java构造函数_JAVA的构造函数是怎么写的。万分感谢。路过的请不要嘲笑%_%
  5. NewCode----求数列的和
  6. LLVM与Codegen技术
  7. des算法密码多长_密码学中的多个DES
  8. 如何在React JS组件和React JS App中添加CSS样式?
  9. Vestigium-Google CodeJam 2020资格回合问题1解决方案
  10. java 负载均衡_java负载均衡 - 岁月静好I的个人空间 - OSCHINA - 中文开源技术交流社区...