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);
}
一开始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);
}
相关文章推荐
- 黑客攻防入门(二)shellcode构造
- OpenCV启动摄像头
- 轻松把玩HttpClient之封装HttpClient工具类(六),封装输入参数,简化工具类
- PHP中this,self,parent的区别
- 在活动中传递参数
- Java并发(2)(未整理完待会回家整理)
- 20160728表结构更改
- 容器学习总结
- Android模拟登陆综合教务系统客户端(java)-jsoup解析数据
- Andorid命令行签名
- NAT
- 轻松把玩HttpClient之封装HttpClient工具类(五),携带Cookie的请求
- 【WebService】wsdl配置详解以及使用注解修改wsdl配置
- nyoj 58 最小步数问题 BFS
- 板瓦工 后台界面中文解释
- IBatis一对多嵌套查询
- nginx的centos和rhel的yum配置安装
- LeetCode#371 Sum of Two Integers
- HDU5762 Teacher Bo 带处理的暴力
- 移动web开发之——viewport