UVA 11990 bit + cdq 分治
来源:互联网 发布:阿里云解析的别名在哪 编辑:程序博客网 时间:2024/05/20 03:39
题意:动态逆序对
做法:对于删除操作可以当做逆向的添加操作 , 所以对于每个数字都有三个属性 (T,ID,Num) 所以这道题其实就是一个三维偏序问题 。 对于一个数 只需要 左边比它大的数 和右边比它小的数 ,我们可以用一个bit logn 进行操作。
三位偏序 可以用CDQ 减去一维 , 我们先把左边算出来 ,再把右边算出来,最后处理中间部分的。
对于中间的部分 用双指针 一个指向 L,MID(时间)。 一个指向MID+1,R(时间) 就可以消除T的影响 , 同时左右两边满足 id 是递增的!
#include <cstdio>#include <cstring>using namespace std;typedef long long ll;const int maxn=2e5+10;struct node{ int t,num,id;}a[maxn],b[maxn];int n, m;int pos[maxn];ll ans[maxn];int l[maxn],r[maxn],bit[maxn];inline void updata(int pos,int val){ for(int i=pos;i<=n;i+=(i&(-i)) ) bit[i]+=val;}inline int query(int pos){ int ans=0; for(int i=pos;i;i-=(i&(-i))) ans+=bit[i]; return ans;}inline void cdq(int begin,int end){ if(begin >= end) return; int mid=(begin+end)>>1; int l1 = begin ,l2=mid+1,temp; for(int i=begin;i<=end;++i) { if(a[i].t<=mid) b[l1++]=a[i]; else b[l2++]=a[i]; } for(int i=begin;i<=end;++i) a[i]=b[i]; temp=begin; for(int i=mid+1;i<=end;++i) { for( ; temp<=mid &&a[temp].id<a[i].id;temp++) updata(a[temp].num,1); l[a[i].t]+=(temp - begin - query(a[i].num)); } for(int i=begin;i<=temp-1;i++) updata(a[i].num,-1); temp = mid; for(int i=end;i>=mid+1;--i) { for(; temp>=begin && a[temp].id >a[i].id ; temp--) updata(a[temp].num,1); r[a[i].t] += query(a[i].num-1); } for(int i=temp+1;i<=mid;i++) updata(a[i].num , -1); cdq(begin,mid); cdq(mid+1,end);}int main(){ while(scanf("%d%d",&n,&m)!=EOF) { memset(l,0,sizeof(l)); memset(r,0,sizeof(r)); memset(bit,0,sizeof(bit)); memset(ans,0,sizeof(ans)); for(int i=1;i<=n;++i) { scanf("%d",&a[i].num); a[i].id=i; a[i].t=0; pos[a[i].num]=i; } int tt=n,x; for(int i=1;i<=m;++i) { scanf("%d",&x); a[pos[x]].t = tt--; } for(int i=1;i<=n;++i) { if(a[i].t==0) a[i].t=tt--; } cdq(1,n); for(int i=1;i<=n;++i) ans[i]=ans[i-1] + l[i] + r[i]; for(int i=n;i>=n-m+1;--i) printf("%lld\n",ans[i]); } return 0;}
阅读全文
0 0
- UVA 11990 bit + cdq 分治
- [Uva 11990] "Dynamic" Inversion (CDQ分治入门)
- [BZOJ1176][Balkan2007]Mokia(cdq分治+bit)
- [BZOJ3262]陌上花开(cdq分治+bit)
- [BZOJ3262]陌上花开(cdq分治+bit)
- 【BZOJ3295】动态逆序对,CDQ分治/BIT套权值线段树
- [BZOJ2716][Violet 3]天使玩偶(cdq分治+bit)
- COGS 2580. [HZOI 2015]偏序 II (CDQ分治+BIT)
- cdq分治
- cdq分治
- cdq分治
- cdq分治
- [BZOJ4430][Nwerc2015]Guessing Camels赌骆驼(cdq分治+bit||bit)
- BZOJ3295:[Cqoi2011]动态逆序对 (BIT套treap/CDQ分治+BIT)
- hdu 4742 Pinball Game 3D(三维LIS&cdq分治&BIT维护最值)
- 51nod 1376 最长递增子序列的数量(dp、CDQ分治 | BIT)
- [BZOJ2253][2010 Beijing wc]纸箱堆叠(dp+bit+cdq分治)
- 时间分治(cdq分治)
- 小随笔 SQL语句中的条件判断CASE
- php的public、protected、private三种访问控制模式的区别
- Linux tcpdump命令详解
- Linux计算md5sum(md5校验和) && 使用crypt和gpg加密/解密文件
- 在Linux上使用netstat命令查证DDOS攻击的方法
- UVA 11990 bit + cdq 分治
- 二维数组之矩阵转置
- 关路灯(区间dp)
- day2
- 【学习笔记】Vue中实现双向数据绑定的原理
- 忽略git已经跟踪的文件或者目录
- (转)jiebaR中文分词快速入门
- Android AIDL使用详解
- MongoDB3.4远程连接