您的位置:首页 > 其它

bzoj 1208: [HNOI2004]宠物收养所 splay

2016-07-28 18:22 330 查看
分析:裸的slay,没啥好说的。。。

一开始WA的原因是写删除操作时没有更新根节点,在写ans%MOD的时候没写对

然后就A啦啦啦啦

代码:

#include<iostream>
#include<cstdio>
#include<cstdlib>
#define inf 0x7fffffff
#define MOD 1000000
using namespace std;

int n,tot,root;
struct tree{int l,r,fa,k;}t[100005];

void rttl(int x)
{
int y=t[x].r;
if (x==root) root=y;
t[x].r=t[y].l;
t[t[y].l].fa=x;
t[y].fa=t[x].fa;
if (x==t[t[x].fa].l) t[t[x].fa].l=y;
else t[t[x].fa].r=y;
t[y].l=x;
t[x].fa=y;
}

void rttr(int x)
{
int y=t[x].l;
if (x==root) root=y;
t[x].l=t[y].r;
t[t[y].r].fa=x;
t[y].fa=t[x].fa;
if (x==t[t[x].fa].l) t[t[x].fa].l=y;
else t[t[x].fa].r=y;
t[y].r=x;
t[x].fa=y;
}

void splay(int x)
{
if (x==0) return;
while (x!=root)
{
int f=t[x].fa;
if (f==root)
if (x==t[f].l) rttr(f);
else rttl(f);
else
{
int p=t[f].fa;
if (x==t[f].l)
{
if (f==t[p].l)
{
rttr(p);rttr(f);
}else
{
rttr(f);rttl(p);
}
}else
{
if (f==t[p].l)
{
rttl(f);rttr(p);
}else
{
rttl(p);rttl(f);
}
}
}
}
}

int behind(int x)
{
x=t[x].r;
while (t[x].l)
x=t[x].l;
return x;
}

void del(int x)
{
int f=t[x].fa;
if (t[x].l==0||t[x].r==0)
{
if (t[x].l==t[x].r)
{
if (x==root) root=0;
if (x==t[f].l) t[f].l=0;
else t[f].r=0;
}else
{
if (t[x].l==0)
{
if (x==root) root=t[x].r;
t[t[x].r].fa=f;
if (x==t[f].l) t[f].l=t[x].r;
else t[f].r=t[x].r;
}else
{
if (x==root) root=t[x].l;
t[t[x].l].fa=f;
if (x==t[f].l) t[f].l=t[x].l;
else t[f].r=t[x].l;
}
}
splay(f);
}else
{
int y=behind(x);
t[x].k=t[y].k;
del(y);
splay(x);
}
}

int findmx(int k)
{
int x=root,y=0;
while (x)
{
if (t[x].k<=k)
{
y=x;
x=t[x].r;
}else
{
x=t[x].l;
}
}
if (y) splay(y);
return y;
}

int findmn(int k)
{
int x=root,y=0;
while(x)
{
if (t[x].k>=k)
{
y=x;
x=t[x].l;
}else
{
x=t[x].r;
}
}
if (y) splay(y);
return y;
}

void insert(int k)
{
t[++tot].k=k;
if (!root)
{
root=tot;
return;
}
int x=root,y;
while (x)
{
y=x;
if (k<t[x].k) x=t[x].l;
else x=t[x].r;
}
t[tot].fa=y;
if (k<t[y].k) t[y].l=tot;
else t[y].r=tot;
splay(tot);
}

int main()
{
t[0].k=inf;
scanf("%d",&n);
int flag,ans=0;
for (int i=1;i<=n;i++)
{
int x,y;
scanf("%d%d",&x,&y);
if (flag==x||root==0)
{
flag=x;
insert(y);
}else
{
int l=findmx(y),r=findmn(y);
if (abs(y-t[l].k)<=abs(t[r].k-y))
{
ans+=(y-t[l].k);
ans%=MOD;
del(l);
}else
{
ans+=(t[r].k-y);
ans%=MOD;
del(r);
}
}
}
printf("%d",ans);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: