Splay questions. The same operation as that on HDU .... Review splay, and the results returned by the request are slow... Wait for more than five minutes .... Verdict is empty in the image above the image... I don't know why. However, the results returned by the virtual OJ are very slow .. Processing is so strange.
Question address: http://uva.onlinejudge.org/index.php? Option = com_onlinejudge & Itemid = 8 & page = show_problem & problem = 3073
#include<iostream>#include<cstring>#include<algorithm>#include<string>#include<cstdio>using namespace std;#define MAXN 250000int next[MAXN];struct nodes{ int ch[2],f; int key,size,w,col;}node[MAXN];void init(){ for(int i=0;i<MAXN-10;i++) next[i]=i+1;}int newnode(int key){ int p=next[0]; next[0]=next[p]; node[p].key=key; node[p].w=node[p].size=1; node[p].col=0; node[p].ch[0]=node[p].ch[1]=node[p].f=0; return p;}void delnode(int p){ next[p]=next[0]; next[0]=p;}struct spt{ int root; void clear() { root=0; } void rotate(int x,int c) { int y=node[x].f; push_down(y);push_down(x); node[y].ch[!c]=node[x].ch[c]; if(node[x].ch[c]) node[node[x].ch[c]].f=y; node[x].f=node[y].f; if(node[y].f) { if(node[node[y].f].ch[0]==y) node[node[y].f].ch[0]=x; else node[node[y].f].ch[1]=x; } node[x].ch[c]=y; node[y].f=x; push_up(y); if(y==root) root=x; } void splay(int x,int f) { push_down(x); for(;node[x].f!=f;) { push_down(node[node[x].f].f); push_down(node[x].f); push_down(x); if(node[node[x].f].f==f) { if(node[node[x].f].ch[0]==x) rotate(x,1); else rotate(x,0); } else { int y=node[x].f; int z=node[y].f; if(node[z].ch[0]==y) { if(node[y].ch[0]==x) rotate(y,1),rotate(x,1); else rotate(x,0),rotate(x,1); } else { if(node[y].ch[1]==x) rotate(y,0),rotate(x,0); else rotate(x,1),rotate(x,0); } } } push_up(x); if(!f) root=x; } void split(int l,int r,int &s2) { select(l,0); select(r+2,root); int tmp=node[node[root].ch[1]].ch[0]; node[node[root].ch[1]].ch[0]=0; push_up(node[root].ch[1]); push_up(root); s2=tmp; } void reverse(int l,int r) { select(l,0); select(r+2,root); node[node[node[root].ch[1]].ch[0]].col^=1; } int select(int k,int rt) { int tmp,t=root; for(;;) { push_down(t); int l=node[node[t].ch[0]].size; if(k>l && k<=l+node[t].w) break; if(k<=l) t=node[t].ch[0]; else k-=(l+node[t].w),t=node[t].ch[1]; } splay(t,rt); return t; } int getmin(int p) { push_down(p); while(node[p].ch[0]) { p=node[p].ch[0]; push_down(p); } return p; } int getmaxn(int p) { push_down(p); while(node[p].ch[1]) { p=node[p].ch[1]; push_down(p); } return p; } void push_down(int rt) { if(rt && node[rt].col) { swap(node[rt].ch[0],node[rt].ch[1]); int l=node[rt].ch[0]; int r=node[rt].ch[1]; node[l].col^=1; node[r].col^=1; node[rt].col=0; } } void push_up(int rt) { if(!rt)return; int l=node[rt].ch[0]; int r=node[rt].ch[1]; int ret=node[rt].w; if(l) ret+=node[l].size; if(r) ret+=node[r].size; node[rt].size=ret; } void del(int p) { if(!p) return; del(node[p].ch[0]); del(node[p].ch[1]); delnode(p); } int build(int l,int r,int f) { if(l>r) return 0; int m=(l+r)>>1; int p=newnode(m); node[p].f=f; node[p].ch[0]=build(l,m-1,p); node[p].ch[1]=build(m+1,r,p); push_up(p); return p; } void cut(int a,int b,int c) { spt tmp; split(a,b,tmp.root); select(c+1,0); c=getmin(node[root].ch[1]); splay(c,root); node[node[root].ch[1]].ch[0]=tmp.root; node[tmp.root].f=c; push_up(node[root].ch[1]); push_up(root); }};spt s1;int n,m;void out(int p){ if(!p) return; else { s1.push_down(p); out(node[p].ch[0]); if(node[p].key!=n+1 && node[p].key!=0)printf("%d\n",node[p].key); out(node[p].ch[1]); }}void prepare(){ s1.clear(); s1.root=newnode(0); node[s1.root].ch[1]=newnode(n+1); node[node[s1.root].ch[1]].f=s1.root; node[node[s1.root].ch[1]].ch[0]=s1.build(1,n,node[s1.root].ch[1]); s1.push_up(node[s1.root].ch[1]); s1.push_up(s1.root);}int main(){ init(); while(~scanf("%d%d",&n,&m)) { prepare(); int a,b; for(int i=0;i<m;i++) { scanf("%d%d",&a,&b); if(b<a) swap(a,b); int e=n-(b-a+1); s1.reverse(a,b); s1.cut(a,b,e); } out(s1.root); s1.del(s1.root); } return 0;}