您的位置:首页 > 其它

2017.9.4 斜堆 失败总结

2017-09-04 21:44 239 查看
这个题之前根本不知道斜堆是什么东西、

所以强行模拟找规律、、

然后发现这个旋转操作是可逆的,

就可以根据放入的操作直接推出取出最新放的点的操作

然后就不会了、、

%%点击打开链接

为什么总是碰上结论题、(虽然只是自己弱不会推结论)

上面的解释已经很好懂了,,因为每次操作都是在左子树、、所以只考虑左路径

那选点的时候必须注意,如果有点没有右子树了,那必须取他,除非左儿子为叶节点

不然删了下面的点,这个点的左儿子变成右儿子,在加入下面的这个点就不会在原来的链上了、

所以这么取,取完就好了、

码:

#include<iostream>
#include<cstdio>
using namespace std;
int rt,ch[100005][2],fu[100005],n,i,d[100005],ans[100005];
int zhao()
{
int o=rt;
int xz;
while(1)
{
if(ch[o][0]==0)
{
xz=o;
break;
}
if(ch[o][1]==0)
{
if(ch[ch[o][0]][0]==0)
{
xz=ch[o][0];
break;
}else
{
xz=o;
break;
}
}else
{
o=ch[o][0];
}
}
o=fu[xz];
if(xz==rt)rt=ch[xz][0];
ch[o][0]=ch[xz][0];
fu[ch[xz][0]]=o;
while(o!=0)
{
if(ch[o][1]!=0) swap(ch[o][0],ch[o][1]);
o=fu[o];
}
return xz;
}
int main()
{
scanf("%d",&n);n++;
rt=1;
for(i=1;i<n;i++)
{
scanf("%d",&d[i]);
if(d[i]>=100)d[i]-=100,ch[d[i]+1][1]=i+1;
else ch[d[i]+1][0]=i+1;
fu[i+1]=d[i]+1;
}
for(i=1;i<=n;i++)
{
ans[n-i+1]=zhao()-1;
}
for(i=1;i<=n;i++)
printf("%d ",ans[i]);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: