标签:hup 数组 整数 -- int php 点击 数字 操作
★★☆ 输入文件:arr.in
输出文件:arr.out
简单对比
时间限制:1 s 内存限制:4 MB
Source: SDOI2007 Day2
【问题描述】
#include <cstdio> #include <cctype> #define N 105000 int data[N],cnt[N],siz[N],ch[N][2],fa[N],root,cn,n,m; inline int son(int x) {return ch[fa[x]][1]==x;} inline void read(int &x) { register char ch=getchar(); for(x=0;!isdigit(ch);ch=getchar()); for(;isdigit(ch);x=x*10+ch-‘0‘,ch=getchar()); } inline void pushup(int rt) { int l=ch[rt][0],r=ch[rt][1]; siz[rt]=siz[l]+siz[r]+cnt[rt]; } void rotate(int x) { int y=fa[x],z=fa[y],b=son(x),c=son(y),a=ch[x][!b]; if(z) ch[z][c]=x; else root=x; fa[x]=z; if(a) fa[a]=y; ch[y][b]=a; ch[x][!b]=y; fa[y]=x; pushup(y); pushup(x); } void splay(int x,int i) { while(fa[x]!=i) { int y=fa[x],z=fa[y]; if(z==i) rotate(x); else { if(son(x)==son(y)) rotate(y),rotate(x); else rotate(x),rotate(x); } } } void ins(int &rt,int x) { if(!rt) { rt=++cn; data[cn]=x; cnt[cn]=siz[cn]=1; splay(cn,0); return; } if(data[rt]==x) { cnt[rt]++; siz[rt]++; splay(rt,0); return; } if(x<data[rt]) { ins(ch[rt][0],x); fa[ch[rt][0]]=rt; pushup(rt); } else { ins(ch[rt][1],x); fa[ch[rt][1]]=rt; pushup(rt); } } int getkth(int rt,int k) { int l=ch[rt][0]; if(siz[l]+1<=k&&k<=siz[l]+cnt[rt]) return rt; if(siz[l]+1>k) return getkth(ch[rt][0],k); if(cnt[rt]+siz[l]<k) k-=siz[l]+cnt[rt],getkth(ch[rt][1],k); } int getmn(int rt) { int ret=-1,p=rt; while(p) { ret=p; p=ch[p][0]; } return ret; } void del(int rt,int x) { if(data[rt]==x) { if(cnt[rt]>1) { siz[rt]--; cnt[rt]--; } else { splay(rt,0); int p=getmn(ch[rt][1]); if(p!=-1) { splay(p,rt); root=p;fa[p]=0; ch[p][0]=ch[rt][0]; fa[ch[rt][0]]=p; } else { root=ch[rt][0]; fa[ch[rt][0]]=0; } } return; } if(x<data[rt]) { del(ch[rt][0],x); pushup(rt); } else { del(ch[rt][1],x); pushup(rt); } } int Main() { freopen("arr.in","r",stdin); freopen("arr.out","w",stdout); read(n);read(m); char str[5]; for(int k;m--;) { scanf("%s",str); read(k); if(str[0]==‘i‘) ins(root,k); else { int x=data[getkth(root,k)]; printf("%d\n",x); del(root,x); } } return 0; } int sb=Main(); int main(int argc,char *argv[]){;}
标签:hup 数组 整数 -- int php 点击 数字 操作
原文地址:http://www.cnblogs.com/ruojisun/p/7609441.html