标签:binary 方便 get struct 最大 两种 void mil 节点
#include<algorithm> #include<iostream> #include<cstring> #include<cstdio> #include<cmath> #define LL long long #define mod 1000000 #define M 80010 using namespace std; LL read(){ LL nm=0,oe=1;char cw=getchar(); while(!isdigit(cw)) oe=cw==‘-‘?-oe:oe,cw=getchar(); while(isdigit(cw)) nm=nm*10+(cw-‘0‘),cw=getchar(); return nm*oe; } LL n,m,ans,T,tpe,t,w; struct binary_search_tree{ LL ace,l[M],r[M],p[M],cnt,tp[M],sz; void init(){l[0]=r[0]=cnt=ace=sz=0,p[0]=tp[0];} void rotate(LL x){ if(ace==x) return; LL top=tp[x]; if(ace==top) tp[ace]=x,ace=x; else{ if(l[tp[top]]==top) l[tp[top]]=x; else r[tp[top]]=x; tp[x]=tp[top],tp[top]=x; } if(l[top]==x) l[top]=r[x],tp[r[x]]=top,r[x]=top; else r[top]=l[x],tp[l[x]]=top,l[x]=top; } void splay(LL x){ if(x==0) return; while(ace!=x){ LL k=tp[x]; if(k==ace) rotate(x); else if(l[l[tp[k]]]==x||r[r[tp[k]]]==x) rotate(k); else rotate(x); } return; } void del(LL x){ sz--; if(x==0){return;} splay(x); if(l[x]==0&&r[x]==0){init();return;} if(l[x]==0) ace=r[x]; else if(r[x]==0) ace=l[x]; else{ LL k=l[x]; if(r[k]==0){l[ace]=l[k],tp[l[k]]=ace,p[ace]=p[k];return;} while(r[k]!=0) k=r[k]; r[tp[k]]=l[k],tp[l[k]]=tp[k],p[ace]=p[k]; } } void insert(LL x){ sz++; if(ace==0){p[++cnt]=x,ace=cnt,l[cnt]=r[cnt]=0;return;} LL pos=ace,big=0; while(pos!=0){ if(p[pos]<=x){ if(r[pos]==0){r[pos]=++cnt,p[cnt]=x,tp[cnt]=pos;break;} pos=r[pos]; } else{ if(l[pos]==0){l[pos]=++cnt,p[cnt]=x,tp[cnt]=pos;break;} pos=l[pos]; } big++; } l[cnt]=r[cnt]=0; if(big>=30) splay(cnt); } LL find(LL x){ LL k=ace,len=99999999999999ll,num=ace; while(true){ if(k==0) break; if(p[k]==x) return k; if(p[k]>x){ if(len>p[k]-x) len=p[k]-x,num=k; k=l[k]; } else{ if(len>=x-p[k]) len=x-p[k],num=k; k=r[k]; } } return num; } }pet,hum; LL ab(LL x){return x>0?x:-x;} int main(){ pet.init(),hum.init(); T=read(); while(T--){ tpe=read(),t=read(); if(tpe==0){ if(hum.ace==0) pet.insert(t); else{ w=hum.find(t); ans+=ab(t-hum.p[w]); hum.del(w); } } else{ if(pet.ace==0) hum.insert(t); else{ w=pet.find(t); ans+=ab(t-pet.p[w]); pet.del(w); } } } printf("%lld\n",ans%mod); return 0; }
HNOI2004宠物收养所(splay维护二叉搜索树模板题)
标签:binary 方便 get struct 最大 两种 void mil 节点
原文地址:http://www.cnblogs.com/OYJason/p/7905615.html