首页 > 代码库 > TLE代码存档
TLE代码存档
#include <ctype.h>#include <cstdio>#define N 200010void read(int &x){ x=0; char ch=getchar(); while(!isdigit(ch)) ch=getchar(); while(isdigit(ch)) {x=x*10+ch-‘0‘;ch=getchar();} }int M;struct Tree{ int Fre,size,dis,fa; int child[2];}tr[N];int cnt,root;int get_son(int x) {return tr[tr[x].fa].child[1]==x;} void update(int x){ tr[x].size=tr[x].Fre; if(tr[x].child[0]) tr[x].size+=tr[tr[x].child[0]].size; if(tr[x].child[1]) tr[x].size+=tr[tr[x].child[1]].size;}void rotate(int x){ int fa=tr[x].fa; int grand=tr[fa].fa; int pos=get_son(x); tr[fa].child[pos]=tr[x].child[pos^1]; tr[tr[fa].child [pos]].fa=fa; tr[x].child [pos^1]=fa; tr[fa].fa=x; tr[x].fa=grand; if(grand) tr[grand].child[tr[grand].child[1]==fa]=x; update(fa); update(x);}void splay(int x){ for(int fa;fa=tr[x].fa;rotate(x)) if(tr[fa].fa) rotate(get_son(x)==get_son(fa)?fa:x); root=x;}void insert(int x){ if(!root) { cnt++; tr[cnt].dis=x; tr[cnt].size=1; tr[cnt].Fre=1; root=cnt; return; } int fa=0,now=root; while(true) { if(tr[now].dis==x) { tr[now].dis++; tr[now].Fre++; splay(now); return; } fa=now; now=tr[now].child[x>tr[fa].dis]; if(!now) { cnt++; tr[fa].child[x>tr[fa].dis]=cnt; tr[cnt].fa=fa; tr[cnt].dis=x; tr[cnt].size=1; tr[cnt].Fre=1; splay(cnt); return; } }}int get_xth(int x){ int now=root; while(true) { if(tr[now].child[0]&&x<=tr[tr[now].child[0]].size) { now=tr[now].child[0]; continue; } int tmp=(tr[now].child[0]?tr[tr[now].child[0]].size:0)+tr[now].Fre; if(x<=tmp) return tr[now].dis; x-=tmp; now=tr[now].child[1]; }}int get_rank(int x){ int now=root; int ans=0; while(true) { if(x<tr[now].dis) { now=tr[now].child[0]; continue; } ans+=tr[now].child[0]?tr[tr[now].child[0]].size:0; if(tr[now].dis==x) { splay(now); return ans+1; } ans+=tr[now].Fre; now=tr[now].child[1]; }}int find_suffix(){ int now=tr[root].child[1]; while(tr[now].child[0]) now=tr[now].child[0]; return now;}void clear(int x){ tr[x].child[1]=0; tr[x].child[1]=1; tr[x].size=0; tr[x].Fre=0; tr[x].dis=0; tr[x].fa=0;}int get_value(int x){ return tr[x].dis;}int find_prefix(){ int now=tr[root].child[0]; while(tr[now].child[1]) now=tr[now].child[1]; return now;}void Delete(int x){ get_rank(x); if(tr[root].Fre>1) { tr[root].Fre--; tr[root].size--; return; } if(!tr[root].child[0]&&!tr[root].child[1]) { clear(root); root=0; return; } if(!tr[root].child[0]) { int tmp=root; root=tr[root].child[1]; tr[root].fa=0; clear(tmp); return; } if(!tr[root].child[1]) { int tmp=root; root=tr[root].child[0]; tr[root].fa=0; clear(tmp); return; } int prefix=find_prefix(); int tmp=root; splay(prefix); tr[root].child[1]=tr[tmp].child[1]; tr[tr[tmp].child[1]].fa=root; clear(tmp); update(root);}int main(int argc,char *argv[]){ read(M); int opt,x; for(;M--;) { read(opt); read(x); if(opt==1) insert(x); else if(opt==2) Delete(x); else if(opt==3) printf("%d\n",get_rank(x)); else if(opt==4) printf("%d\n",get_xth(x)); else if(opt==5) { insert(x); printf("%d\n",get_value(find_prefix())); Delete(x); } else { insert(x); printf("%d\n",get_value(find_suffix())); Delete(x); } } return 0;}
TLE代码存档
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。