codevs1285 宠物收养所 splayTree
来源:互联网 发布:国际数据公司idc官网 编辑:程序博客网 时间:2024/04/29 23:23
删除节点时把它移到根节点,把它的后继移到根的右子节点,然后删除根。
#include<iostream>#include<cstring>#include<cstdio>#include<algorithm>#include<cmath>#define inf 1000000000using 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;}
0 0
- codevs1285 宠物收养所 splayTree
- 【codevs1285】【BZOJ1208】宠物收养所,splay练习
- BZOJ 1208: [HNOI2004]宠物收养所 (Splaytree)
- HNOI宠物收养所
- [HNOI2004]宠物收养所
- HNOI2004宠物收养所
- HNOI2004-宠物收养所
- BZOJ1208 宠物收养所
- 宠物收养所
- wikioi1285宠物收养所
- 【HNOI2004】宠物收养所
- [HNOI2004]宠物收养所
- HNOI2004 宠物收养所
- Bzoj1208 宠物收养所
- [HNOI2004]宠物收养所
- [HNOI2004]宠物收养所 SBT
- HNOI2004 宠物收养所 SBT
- 【HNOI2004】【SBT】宠物收养所
- 分割平面,平面分割空间问题
- IOS下用Zbar实现摄像头扫描二维码和扫描本地相册二维码
- poj2828
- 洛谷2279 03湖南 消防局的设立
- git常用命令
- codevs1285 宠物收养所 splayTree
- java并发编程之wait,notify,深挖,引申出Monitor概念,简单介绍
- dp第一步!!!!最长公共子序列 POJ 1458
- 转载MyBatis学习 之 三、动态SQL语句
- JavaBean
- AOP术语
- 单链表的逆置--普通循环方法(详细图解)
- FZU 1650 1752 a^b mod c
- 【工具】创建GitHub代码库(MyGit最基本的使用)