POJ 1442 Black Box [treap]
2015-09-18 15:28
429 查看
题意:给出N个要添加的数,M个询问,对于第i个询问,会有一个数a,即前a个数添加到一个黑箱里,问第i小是哪个。
范围: N,M<=3W
解法: treap 求K大即可。
代码:
范围: N,M<=3W
解法: treap 求K大即可。
代码:
#include<stdio.h> #include<string.h> #include<algorithm> #include<math.h> #include<iostream> #include<stdlib.h> #include<set> #include<map> #include<queue> #include<vector> #include<bitset> #pragma comment(linker, "/STACK:1024000000,1024000000") template <class T> bool scanff(T &ret){ //Faster Input char c; int sgn; T bit=0.1; if(c=getchar(),c==EOF) return 0; while(c!='-'&&c!='.'&&(c<'0'||c>'9')) c=getchar(); sgn=(c=='-')?-1:1; ret=(c=='-')?0:(c-'0'); while(c=getchar(),c>='0'&&c<='9') ret=ret*10+(c-'0'); if(c==' '||c=='\n'){ ret*=sgn; return 1; } while(c=getchar(),c>='0'&&c<='9') ret+=(c-'0')*bit,bit/=10; ret*=sgn; return 1; } #define inf 1073741823 #define llinf 4611686018427387903LL #define PI acos(-1.0) #define lth (th<<1) #define rth (th<<1|1) #define rep(i,a,b) for(ll i=a;i<=b;i++) #define drep(i,a,b) for(ll i=a;i>=b;i--) #define gson(i,root) for(ll i=ptx[root];~i;i=ed[i].next) #define mem(x,val) memset(x,val,sizeof(x)) #define mkp(a,b) make_pair(a,b) #define findx(x) lower_bound(b+1,b+1+bn,x)-b #define pb(x) push_back(x) using namespace std; typedef long long ll; int n,m; int a[100100],ans[100100]; struct query{ int l,r,k,idx; bool operator <(const query x)const{ if(l==x.l)return r<x.r; return l<x.l; } }q[100100]; //treap int tot,root; struct node{ int size,val,rnd,l,r; }t[100100]; void maintain(int x){ if(x<=0)return; t[x].size=t[t[x].l].size+t[t[x].r].size+1; } void lturn(int &x){ int tmp=t[x].r; t[x].r=t[tmp].l; t[tmp].l=x; maintain(x); x=tmp; } void rturn(int &x){ int tmp=t[x].l; t[x].l=t[tmp].r; t[tmp].r=x; maintain(x); x=tmp; } void insert(int &x,int val){ if(x==0){ x=++tot; t[x].val=val; t[x].size=1; t[x].rnd=rand(); t[x].l=t[x].r=0; return; } else if(val<t[x].val){ insert(t[x].l,val); if(t[t[x].l].rnd<t[x].rnd)rturn(x); } else{ insert(t[x].r,val); if(t[t[x].r].rnd<t[x].rnd)lturn(x); } maintain(x); } void dele(int &x,int val){ if(val>t[x].val)dele(t[x].r,val); else if(val<t[x].val)dele(t[x].l,val); else{ if(t[x].l==0)x=t[x].r; else if(t[x].r==0)x=t[x].l; else{ if(t[t[x].l].rnd<t[t[x].r].rnd){ rturn(x); dele(t[x].r,val); } else{ lturn(x); dele(t[x].l,val); } } } maintain(x); } int findk(int x,int k){ int lsz=t[t[x].l].size; int rsz=t[t[x].r].size; if(k==lsz+1)return t[x].val; if(k<=lsz)return findk(t[x].l,k); return findk(t[x].r,k-lsz-1); } int exist(int x,int val){ while(x){ if(t[x].val==val)return 1; else if(val>t[x].val)x=t[x].r; else x=t[x].l; } return 0; } void init(){ tot=root=0; rep(i,1,n)scanff(a[i]); rep(i,1,m)scanff(q[i].l),scanff(q[i].r),scanff(q[i].k),q[i].idx=i; sort(q+1,q+1+m); } void solve(){ int l=1,r=0; rep(i,1,m){ for(;r<q[i].r;r++)insert(root,a[r+1]); for(;l<q[i].l;l++)dele(root,a[l]); ans[q[i].idx]=findk(root,q[i].k); } rep(i,1,m) printf("%d\n",ans[i]); } main(){ while(scanf("%d%d",&n,&m)!=EOF){ init(); solve(); } }
相关文章推荐
- 在64位windows下使用instsrv.exe和srvany.exe创建windows服务
- ubuntu下安装apatch
- Algorithms—127.Word Ladder
- 被虐题
- 随记 INIT GET_COUNT INQUIRE NEWINQUIRE STOP EXIT
- ios9适配,编译报错修改
- Cisco交换机初始化过程
- 将BAT文件注册为服务的方法
- eclipse的快捷键【转载】
- ssh学习--登陆及设置问题
- mysql修复数据表
- 在navigationbar上动态添加按钮,主视图动态删除按钮原理及代码讲解
- UNIX网络编程——socket的keep-alive(超时重传)
- 空间曲线的切线、主法线、副法线
- Activiti工作流(3):activiti核心API
- Linux系统函数read说明
- 人脉——玩火的人早晚自焚
- Learning to rank的讲解,单文档方法(Pointwise),文档对方法(Pairwise),文档列表方法(Listwise)
- UiAutomator之删除在最近运行的所有app
- TCP(传输控制协议)