codevs1285 宠物收养所 splayTree
2015-08-03 16:42
323 查看
删除节点时把它移到根节点,把它的后继移到根的右子节点,然后删除根。
#include<iostream> #include<cstring> #include<cstdio> #include<algorithm> #include<cmath> #define inf 1000000000 using namespace std; const int maxn=200005; struct SplayTree { int son[maxn][2],pre[maxn],val[maxn]; int sum[maxn]; int rt,sz; void pushUp(int x) { sum[x]=sum[son[x][0]]+sum[son[x][1]]+1; } void newNode(int f,int& x,int a) { x=++sz; pre[x]=f; val[x]=a; sum[x]=1; son[x][0]=son[x][1]=0; } void init() { sz=rt=0; } void Rotate(int x,int c) { int y=pre[x]; son[y][!c]=son[x][c]; pre[son[x][c]]=y; pre[x]=pre[y]; if(pre[x]) son[pre[y]][son[pre[y]][1]==y]=x; son[x][c]=y; pre[y]=x; pushUp(y); } void Splay(int x,int goal) { while(pre[x]!=goal) { if(pre[pre[x]]==goal) { if(son[pre[x]][0]==x) Rotate(x,1); else Rotate(x,0); } else { int y=pre[x],z=pre[y]; if(son[z][0]==y) { if(son[y][0]==x) { Rotate(y,1); Rotate(x,1); } else { Rotate(x,0); Rotate(x,1); } } else { if(son[y][1]==x) { Rotate(y,0); Rotate(x,0); } else { Rotate(x,1); Rotate(x,0); } } } } pushUp(x); if(goal==0) rt=x; } void Insert(int a) { if(rt==0) { rt=++sz; val[rt]=a; sum[rt]=1; son[rt][0]=son[rt][1]=0; return; } int x=rt; while(son[x][val[x]<a]) x=son[x][val[x]<a]; newNode(x,son[x][val[x]<a],a); Splay(sz,0); } int getMin(int a) { int Min=inf; int x=rt; while(x) { if(val[x]==a) return a; if(val[x]>a) Min=min(Min,val[x]); if(val[x]>a) x=son[x][0]; else x=son[x][1]; } return Min; } int getMax(int a) { int Max=-inf; int x=rt; while(x) { if(val[x]==a) { return a; } if(val[x]<a) { Max=max(Max,val[x]); } if(val[x]<a) x=son[x][1]; else x=son[x][0]; } return Max; } int Find(int a) { int x=rt; while(x) { if(val[x]==a) return x; if(val[x]>a) x=son[x][0]; else x=son[x][1]; } } void del(int a) { int x=Find(a); Splay(x,0); int tmp=son[x][1]; if(tmp==0) { rt=son[rt][0]; pre[rt]=0; return; } while(son[tmp][0]) { tmp=son[tmp][0]; } Splay(tmp,x); son[tmp][0]=son[rt][0]; pre[son[rt][0]]=tmp; rt=tmp; pre[rt]=0; } }spt; int mod=1000000; int n,a,b; int main() { spt.init(); scanf("%d",&n); int c=0,p=0; int ans=0; while(n--) { scanf("%d%d",&a,&b); if(a==0) { if(p==0) { spt.Insert(b); c++; } else { int mi=spt.getMin(b); int mx=spt.getMax(b); if(abs(mx-b)<=abs(mi-b)) { spt.del(mx); ans=(ans+abs(mx-b))%mod; } else { spt.del(mi); ans=(ans+abs(mi-b))%mod; } p--; } } else { if(c==0) { spt.Insert(b); p++; } else { int mi=spt.getMin(b); int mx=spt.getMax(b); if(abs(mx-b)<=abs(mi-b)) { spt.del(mx); ans=(ans+abs(mx-b))%mod; } else { spt.del(mi); ans=(ans+abs(mi-b))%mod; } c--; } } } printf("%d\n",ans); return 0; }
相关文章推荐
- [.Net码农]FileUpload.PostedFile 属性
- JavaBean
- 单链表的逆置--普通循环方法(详细图解)
- Tarjan算法求解无向连通图的割点、割边、点双连通分量和边双连通分量的模板
- IOS下用Zbar实现摄像头扫描二维码和扫描本地相册二维码
- Algorithms—240.Search a 2D Matrix II
- 关于指针的*和&
- 微软账号怎么注册?微软账号注册方法
- 依赖注入与JSR-330的参考实现——Guice
- 分割平面,平面分割空间问题
- CRectTracker源码学习笔记
- VS2012编译Lua5.3.1
- jsp页面中form表单提交到数据库的方法
- iOS开发系列--UITableView全面解析
- 洛谷2279 03湖南 消防局的设立
- oracle exp EXP-00008: 遇到 ORACLE 错误 904
- 辛星整理域名下的cookie问题
- UVA 177 PaperFolding 折纸痕 (分形,递归)
- 2015-8-3 暑假过了一半了
- VS2012编译Lua5.3.1