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

本文共 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

你可能感兴趣的文章
第一章 学习shiro
查看>>
ISA部署防火墙策略的十六条守则
查看>>
利用Windows AD搭建KMS服务器
查看>>
java项目命名规则
查看>>
Understanding Spark Caching
查看>>
抓取服务器硬件信息脚本
查看>>
四种禁止下载软件的方法
查看>>
Domino 8.5.1 安装过程
查看>>
重构数据库设计
查看>>
【CentOS 7笔记32】,通配符、输入输出重定向#171116
查看>>
【CentOS 7笔记43】iptables nat表和iptables规则备份和恢复,#171130
查看>>
jQuery基础修炼圣典—DOM篇
查看>>
hyper-v关于avhd的问题
查看>>
2013年工作中遇到的20个问题:281-300
查看>>
shell脚本实现两个文件的逐行对比
查看>>
我的友情链接
查看>>
烂泥:haproxy与nginx、zabbix集成
查看>>
iptables kits
查看>>
MyEclipse 2014 系列 , MyEclipse 2013 系列 , MyEclipse 10 系列
查看>>
java使用log4j打出exception的栈信息
查看>>