【bzoj3295】 Cqoi2011—动态逆序对
http://www.lydsy.com/JudgeOnline/problem.php?id=3295 (题目链接)
题意
给出某种排列,按照某种顺序依次删除m个数,在每次删除一个数前统计序列中逆序对对个数。
Solution
作为一个CDQ分治的初学者,我毫不犹豫的%了LCF的题解。
这里介绍下三维偏序的求法:一维排序,二维归并,三维树状数组。
排序维护x维之后,递归处理:
1.在处理区间[L,R]的时候,先二分区间[L, (L+R)/ 2],递归求这个左区间(二分的原因是我在维护y维的时候难免破坏x维的性质,但是二分之后我还是可以保证左区间的x全都大于右区间的x)。
2.这个时候左区间y维已经有序,我们只好把右区间[(L+R)/2,R],快排一遍,进行归并式的dp转移(左区间一个指针,右区间一个指针,保证左区间指针所扫过的y一定小于右区间指针所扫过的y),然后在用常规的树状数组维护z。
3.当然,最后还应该把右区间[(L+R)/2,R]按x快排回去,并递归处理这一段。
4.最后归并或者快排维护整个区间的y有序。
像这种题目,经常把时间作为第三维做三维偏序。
细节
?
代码
// bzoj3295
#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<cmath>
#define LL long long
#define inf (1ll<<60)
#define Pi acos(-1.0)
#define free(a) freopen(a".in","r",stdin),freopen(a".out","w",stdout)
using namespace std; const int maxn=100010;
int c[maxn],f[maxn],pos[maxn],n,m;
struct data {int x,y,z;}a[maxn],t[maxn]; bool cmp(data a,data b) {
return a.z<b.z;
}
int lowbit(int x) {
return x&-x;
}
void add(int x,int val) {
for (int i=x;i<=n;i+=lowbit(i)) c[i]+=val;
}
LL query(int x) {
int res=0;
for (int i=x;i;i-=lowbit(i)) res+=c[i];
return res;
}
void solve(int l,int r) {
if (l==r) return;
int mid=(l+r)>>1;
solve(l,mid);solve(mid+1,r);
for (int i=l,j=mid+1,k=l;i<=mid || j<=r;) {
if ((j<=r && a[j].x<a[i].x) || i>mid) add(a[j].y,1),t[k++]=a[j++];
else f[a[i].z]+=query(n)-query(a[i].y),t[k++]=a[i++];
}
for (int i=mid+1;i<=r;i++) add(a[i].y,-1);
for (int i=mid,j=r;i>=l || j>=mid+1;) {
if ((j>=mid+1 && a[j].x>a[i].x) || i<l) add(a[j].y,1),j--;
else f[a[i].z]+=query(a[i].y-1),i--;
}
for (int i=mid+1;i<=r;i++) add(a[i].y,-1);
for (int i=l;i<=r;i++) a[i]=t[i];
}
int main() {
scanf("%d%d",&n,&m);
for (int x,i=1;i<=n;i++) scanf("%d",&x),pos[x]=i;
for (int x,i=1;i<=m;i++) scanf("%d",&x),a[pos[x]]=(data){x,pos[x],i};
for (int x=m,i=1;i<=n;i++) if (!a[pos[i]].z) a[pos[i]]=(data){i,pos[i],++x};
sort(a+1,a+1+n,cmp);
solve(1,n);
LL ans=0;
for (int i=1;i<=n;i++) ans+=f[i];
for (int i=1;i<=m;i++) printf("%lld\n",ans),ans-=f[i];
return 0;
}
【bzoj3295】 Cqoi2011—动态逆序对的更多相关文章
- bzoj3295 [Cqoi2011]动态逆序对 cdq+树状数组
[bzoj3295][Cqoi2011]动态逆序对 2014年6月17日4,7954 Description 对于序列A,它的逆序对数定义为满足i<j,且Ai>Aj的数对(i,j)的个数. ...
- bzoj3295[Cqoi2011]动态逆序对 树套树
3295: [Cqoi2011]动态逆序对 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 5987 Solved: 2080[Submit][Sta ...
- 2018.07.01 BZOJ3295: [Cqoi2011]动态逆序对(带修主席树)
3295: [Cqoi2011]动态逆序对 **Time Limit: 10 Sec Memory Limit: 128 MB Description 对于序列A,它的逆序对数定义为满足i<j& ...
- [BZOJ3295][Cqoi2011]动态逆序对 CDQ分治&树套树
3295: [Cqoi2011]动态逆序对 Time Limit: 10 Sec Memory Limit: 128 MB Description 对于序列A,它的逆序对数定义为满足i<j,且 ...
- bzoj千题计划146:bzoj3295: [Cqoi2011]动态逆序对
http://www.lydsy.com/JudgeOnline/problem.php?id=3295 正着删除看做倒着添加 对答案有贡献的数对满足以下3个条件: 出现时间:i<=j 权值大小 ...
- BZOJ3295: [Cqoi2011]动态逆序对(树状数组套主席树)
3295: [Cqoi2011]动态逆序对 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 7465 Solved: 2662[Submit][Sta ...
- BZOJ3295 [Cqoi2011]动态逆序对 —— CDQ分治
题目链接:https://vjudge.net/problem/HYSBZ-3295 3295: [Cqoi2011]动态逆序对 Time Limit: 10 Sec Memory Limit: 1 ...
- bzoj3295: [Cqoi2011]动态逆序对(cdq分治+树状数组)
3295: [Cqoi2011]动态逆序对 题目:传送门 题解: 刚学完cdq分治,想起来之前有一道是树套树的题目可以用cdq分治来做...尝试一波 还是太弱了...想到了要做两次cdq...然后伏地 ...
- [bzoj3295][Cqoi2011]动态逆序对_主席树
动态逆序对 bzoj-3295 Cqoi-2011 题目大意:题目链接. 注释:略. 想法:直接建立主席树. 由于是一个一个删除,所以我们先拿建立好的root[n]的权值线段树先把总逆序对求出来,接着 ...
- bzoj3295: [Cqoi2011]动态逆序对(树套树)
#include <iostream> #include <cstdio> #include <cstring> #include <cmath> #i ...
随机推荐
- div+css兼容 ie6_ie7_ie8_ie9_ie10和FireFox_Chrome等浏览器方法
1.div的垂直居中问题 vertical-align:middle; 将行距增加到和整个DIV一样高 line-height:200px; 然后插入文字,就垂直居中了.缺点是要控制内容不要换行 ...
- 苹果iPhone如何区分港版、国行、水货
要想分辨所购买的苹果产品[iPhone 4.iPod Touch.iPad 2.iMac.MacBook及iPhone 4S]是大陆行货.水货.港货还是其它,其实很简单.今天来教大家如何区分.大陆行货 ...
- .net core注入时作用域的说明
Transient:每次获取实例都是新实例. Scoped:每次web请求都是新实例,在同一web请求是相同的实例. Singleton:实例只创建一次,以后的每次获取都是这一实例.
- Dell 服务器做Raid
Dell 服务器做Raid DELL R720 服务器 RAID阵列卡配置介绍 (H310) 关于 RAID 5 与热备份(Hot Spare) 在不同RAID组间使用热备盘——Global Hot ...
- Theano2.1.21-基础知识之theano中多核的支持
来自:http://deeplearning.net/software/theano/tutorial/multi_cores.html Multi cores support in Theano 一 ...
- .NET C#微信公众号开发远程断点调试(本地远程调试生产环境代码)
最近在做微信公众号开发,由于之前没有接触过,突然发现调试不方便,不方便进行断点跟踪调试.因为微信那边绑定的服务器地址必须是公网地址,但是还是想进行断点调试(毕竟这样太方便了,程序有Bug,一步步断点跟 ...
- Linux权限
在Linux中要修改一个文件夹或文件的权限我们需要用到linux chmod命令来做,下面我写了几个简单的实例大家可参考一下. 语法如下: chmod [who] [+ | - | =] [mode] ...
- Button、ImageButton及ImageView详解
Button.ImageButton及ImageView详解 在应用程序开发过程中,很多时候需要将View的background或者src属性设置为图片,即美观又支持点击等操作.常见的有Button. ...
- 路由信息协议(RIP)的防环机制
防环机制 1-记数最大值(maximum hop count):定义最大跳数(最大为15跳),当跳数为16跳时,目标为不可达. 2-水平分割(split horizon):从一个接口学习到的路由不会再 ...
- MinHash算法
MinHash是用于快速检测两个集合的相似性的方法.改方法由Andrei Broder(1997)发明,并最初用于搜索引擎AltaVista中来检测重复的网页的算法.它同样可以用于推荐系统和大规模文档 ...