博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
BZOJ 3333 排队计划 树状数组+线段树
阅读量:6095 次
发布时间:2019-06-20

本文共 2008 字,大约阅读时间需要 6 分钟。

题目大意:给定一个序列。每次选择一个位置,把这个位置之后全部小于等于这个数的数抽出来,排序,再插回去,求每次操作后的逆序对数

首先我们每一次操作 对于这个位置前面的数 因为排序的数与前面的数位置关系不变 所以这些数的逆序对不会变化

对于这个位置后面比这个数大的数 因为改变位置的数都比这些数小 所以这些数的逆序对不会变化

说究竟就是排序的数的逆序对数改变了 以这些数開始的逆序对没有了

于是就好办了 我们用树状数组统计出以每一个数開始的逆序对数 然后以原数的大小为keyword建立线段树 维护区间最小值

对于每一个询问p,我们取出[p,n]中的最小值a[x]。将a[x]清为正无穷。把以a[x]开头的逆序对减掉,继续找,直到a[p]为正无穷为止

每一个数仅仅会被找到1次 所以均摊复杂度O(nlogn)

#include
#include
#include
#include
#define M 500500#define ls tree[p].lson#define rs tree[p].rsonusing namespace std;struct abcd{ int lson,rson; int *num;}tree[M<<1];int tree_tot;int n,m,tot,a[M];pair
b[M];int c[M],f[M];long long ans;int* _min(int *x,int *y){ return *x>=*y?y:x;}void Build_Tree(int p,int x,int y){ int mid=x+y>>1; if(x==y) { tree[p].num=a+mid; return ; } ls=++tree_tot;rs=++tree_tot; Build_Tree(ls,x,mid); Build_Tree(rs,mid+1,y); tree[p].num=_min(tree[ls].num,tree[rs].num);}int* Get_Ans(int p,int x,int y,int l,int r){ int mid=x+y>>1; if(x==l&&y==r) return tree[p].num; if(r<=mid) return Get_Ans(ls,x,mid,l,r); if(l>mid) return Get_Ans(rs,mid+1,y,l,r); return _min( Get_Ans(ls,x,mid,l,mid) , Get_Ans(rs,mid+1,y,mid+1,r) );}inline void Modify(int p,int x,int y,int pos){ int mid=x+y>>1; if(x==y) return ; if(pos<=mid) Modify(ls,x,mid,pos); else Modify(rs,mid+1,y,pos); tree[p].num=_min(tree[ls].num,tree[rs].num);}inline void Update(int x){ for(;x<=tot;x+=x&-x) c[x]++;}inline int Get_Ans(int x){ int re=0; for(;x;x-=x&-x) re+=c[x]; return re;}int main(){ int i,p; cin>>n>>m; for(i=1;i<=n;i++) scanf("%d",&b[i].first),b[i].second=i; sort(b+1,b+n+1); for(i=1;i<=n;i++) { if(i==1||b[i].first!=b[i-1].first) ++tot; a[b[i].second]=tot; } for(i=n;i;i--) Update(a[i]),ans+=f[i]=Get_Ans(a[i]-1); Build_Tree(0,1,n); printf("%lld\n",ans); for(i=1;i<=m;i++) { int *temp; scanf("%d",&p); if(a[p]!=0x3f3f3f3f) do{ temp=Get_Ans(0,1,n,p,n); ans-=f[temp-a]; *temp=0x3f3f3f3f; Modify(0,1,n,temp-a); }while(temp!=a+p); printf("%lld\n",ans); }}

转载地址:http://oggwa.baihongyu.com/

你可能感兴趣的文章
PAT1001
查看>>
iOS开发基础知识--碎片6
查看>>
编程的艺术门槛
查看>>
微信第三方登陆
查看>>
进程 线程 协程 管程 纤程 概念对比理解
查看>>
JNI返回复杂对象之中的一个
查看>>
Android 使用Retrofit请求API数据
查看>>
前端 2018 届校招笔试面经【百度,阿里,腾讯,阿里文娱,携程,美团,拼多多】...
查看>>
Windows上安装多个MySQL实例(转)
查看>>
mysql导入导出sql文件
查看>>
Mac下Apache服务器配置
查看>>
SuperMap iObject入门开发系列七管线横断面分析
查看>>
[RxJS] Chain RxJS Operators Together with a Custom `pipe` Function using Array.reduce
查看>>
用Python实现一个简单的文件传输协议
查看>>
在大公司和小公司的优缺点(转)
查看>>
使用BeginInvoke,EndInvoke异步调用委托
查看>>
Date 与 SimpleDateFormat
查看>>
为什么JAVA要提供 wait/notify 机制?是为了避免轮询带来的性能损失
查看>>
.CSC.exe编译器使用
查看>>
集成 Maven 2 插件到 Eclipse 的过程
查看>>