博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
二逼平衡树 Tyvj 1730 BZOJ3196 Loj#106
阅读量:7113 次
发布时间:2019-06-28

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

树状数组+主席树,模板题,不多说...

#include 
#include
#include
#include
#include
#include
#include
using namespace std;#define N 50005#define lson l,m,tr[rt].ls#define rson m+1,r,tr[rt].rs#define PushUp(rt) tr[rt].siz=tr[tr[rt].ls].siz+tr[tr[rt].rs].sizstruct node{ int ls,rs,siz;}tr[N*200];int rot[N],a[N],n,Q,nx,ny,rx[N],ry[N],cnt;void insert(int l,int r,int &rt,int v,int c){ if(!rt)rt=++cnt; tr[rt].siz+=c; if(l==r)return ; int m=(l+r)>>1; if(m>=v)insert(lson,v,c); else insert(rson,v,c);}int query_k(int l,int r,int k){ if(l==r)return l; int m=(l+r)>>1,sizls=0; for(int i=1;i<=nx;i++)sizls-=tr[tr[rx[i]].ls].siz; //printf("aaa%d %d %d %d\n",l,r,k,sizls); for(int i=1;i<=ny;i++)sizls+=tr[tr[ry[i]].ls].siz; //printf("bbb%d %d %d %d\n",l,r,k,sizls); if(sizls>=k) { for(int i=1;i<=nx;i++)rx[i]=tr[rx[i]].ls; for(int i=1;i<=ny;i++)ry[i]=tr[ry[i]].ls; return query_k(l,m,k); } for(int i=1;i<=nx;i++)rx[i]=tr[rx[i]].rs; for(int i=1;i<=ny;i++)ry[i]=tr[ry[i]].rs; return query_k(m+1,r,k-sizls);}int query_x(int l,int r,int x){ if(l==r)return 1; int m=(l+r)>>1,sizls=0; for(int i=1;i<=nx;i++)sizls-=tr[tr[rx[i]].ls].siz; for(int i=1;i<=ny;i++)sizls+=tr[tr[ry[i]].ls].siz; if(m>=x) { for(int i=1;i<=nx;i++)rx[i]=tr[rx[i]].ls; for(int i=1;i<=ny;i++)ry[i]=tr[ry[i]].ls; return query_x(l,m,x); } for(int i=1;i<=nx;i++)rx[i]=tr[rx[i]].rs; for(int i=1;i<=ny;i++)ry[i]=tr[ry[i]].rs; return sizls+query_x(m+1,r,x);}void pre(int l,int r){ nx=ny=0; for(int i=l;i;i-=(i&(-i)))rx[++nx]=rot[i]; for(int i=r;i;i-=(i&(-i)))ry[++ny]=rot[i];}int main(){ scanf("%d%d",&n,&Q); for(int i=1;i<=n;i++) { scanf("%d",&a[i]); for(int j=i;j<=n;j+=j&-j) { insert(-1<<30,1<<30,rot[j],a[i],1); } } while(Q--) { int op,x,y,z; scanf("%d%d%d",&op,&x,&y); if(op!=3)scanf("%d",&z),x--; if(op==1) { pre(x,y); printf("%d\n",query_x(-1<<30,1<<30,z)); }else if(op==2) { pre(x,y); printf("%d\n",query_k(-1<<30,1<<30,z)); }else if(op==3) { for(int i=x;i<=n;i+=i&-i)insert(-1<<30,1<<30,rot[i],a[x],-1); a[x]=y; for(int i=x;i<=n;i+=i&-i)insert(-1<<30,1<<30,rot[i],a[x],1); }else if(op==4) { pre(x,y); int rank=query_x(-1<<30,1<<30,z); pre(x,y); printf("%d\n",query_k(-1<<30,1<<30,rank-1)); }else { pre(x,y); int rank=query_x(-1<<30,1<<30,z+1); pre(x,y); printf("%d\n",query_k(-1<<30,1<<30,rank)); } } return 0;}

  

转载于:https://www.cnblogs.com/Winniechen/p/8989784.html

你可能感兴趣的文章
web性能优化
查看>>
PAT A1037
查看>>
从0到1,一步步开发React的loading组件,并发布到npm上
查看>>
sas 做 titanic 未完待续
查看>>
区块链是一种用一种不可变的形式存储数字信息
查看>>
使用react hooks实现自己的context-redux
查看>>
Redis 使用记录(四)
查看>>
2.进程
查看>>
【PAT系列】PAT B1010
查看>>
fiddler跨域
查看>>
如何使用Canvas及动画实现
查看>>
三次握手四次挥手
查看>>
3种方式实现python多线程并发处理
查看>>
微信程序开发系列教程(二)微信订阅号+人工智能问答服务
查看>>
推荐一个高大上的网易云音乐命令行播放工具:musicbox
查看>>
聊聊storm的messageTimeout
查看>>
关于ueditor不能上传图片的问题的解决
查看>>
bootstrap4学习总结
查看>>
渣渣的蚂蚁金服面试经历(二)
查看>>
【静态页面架构】CSS之列表
查看>>