您的位置:首页 > 其它

bzoj 1503==noi2003T1郁闷的收纳员——splay

2013-12-05 22:40 393 查看
啊呀我去。。今天真的是各种煞笔,而且都是煞笔在了输入输出上面。。。

刚刚下午做splay的一个模版题就是因为printf用成了cout,现在晚上scanf又用成了cin。。。。

最无语的是。。我写的代码在bzoj上ac了。。但是到了bsoj上只有70分,T了3个点。。。最神奇的是到了tyvj上直接WA成了0分但是我电脑上的tyvj的数据都过了。。。

应该算是ac了吧。。。反正bzoj上是过了。。。

下面是代码

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define MAX 100005

using namespace std;

int n,i,m,tot=0,top=0;
char c;

int size[MAX],child[MAX][2],father[MAX],value[MAX],cnt[MAX];
int root=0,num=0;

void rotate(int p)
{
//cout<<"rotate"<<endl;
int q=father[p],y=father[q],x=(child[q][1]==p);
//if p is q's right person then x==1 else x==0
//if x==1 then rotate_left
//else if x==0 then rotate_right
father[child[q][x]=child[p][x^1]]=q;
father[child[p][x^1]=q]=p;
father[p]=y;
if(y)
child[y][child[y][1]==q]=p;
size[q]=cnt[q]+size[child[q][0]]+size[child[q][1]];
size[p]=cnt[p]+size[child[p][0]]+size[child[p][q]];
//pay more attention = = -> the size of p,q should re_calc
}

void splay(int x,int aim=0)
{
//cout<<"splay"<<endl;
for(int y;(y=father[x])!=aim;rotate(x))
if(father[y]!=aim)
{
if((child[y][0]==x)==(child[father[y]][0]==y))
rotate(y);
else
rotate(x);
}
if(aim==0)
root=x;
size[x]=size[child[x][0]]+cnt[x]+size[child[x][1]];
}

void insert(int x,int k)
{
if(!x)
{
num++;
root=num;
x=num;
value[x]=k;
father[x]=0;
child[x][1]=child[x][0]=0;

cnt[x]=1;
size[x]=1;
return;
}
while(x)
{
size[x]++;
if(k==value[x])
{
cnt[x]++;
return;
}
int &y=child[x][k>value[x]];
if(!y)
{
num++;
y=num;
father[y]=x;
child[y][0]=child[y][1]=0;
cnt[y]=size[y]=1;
value[y]=k;
break;
}
x=y;
}
splay(x);
}

int ask(int x,int k)//select
{
k--;
for(;;)
{
if(x==0)
return 0;
if(size[child[x][1]]<=k&&k<cnt[x]+size[child[x][1]])
return x;
if(size[child[x][1]]>k)
x=child[x][1];
else
{
k-=cnt[x]+size[child[x][1]];
x=child[x][0];
}
}
}

int find(int x,int k)//search
{
int Ans=0;
for(;;)
{
if(k<value[x])
if(child[x][0])
{
x=child[x][0];
continue;
}
else
return Ans;
if(k>value[x])
{
if(!Ans||value[x]>value[Ans])
Ans=x;
if(child[x][1])
{
x=child[x][1];
continue;
}
else
return Ans;
}
if(k==value[x])
return x;
}
}

int ans=0;
void delete_(int x)
{
splay(x);
ans+=size[child[root][0]]+cnt[root];
father[root=child[x][1]]=0;
}

void debug()
{
cout<<root<<' '<<value[root]<<' '<<value[child[root][0]]<<' '<<value[child[root][1]]<<endl;
cout<<root<<' '<<size[root]<<' '<<size[child[root][0]]<<' '<<size[child[root][1]]<<endl;
cout<<root<<' '<<cnt[root]<<' '<<cnt[child[root][0]]<<' '<<cnt[child[root][1]]<<endl;
}

int main()
{
cin>>n>>m;
int u=0;
for(i=1;i<=n;i++)
{
int k;
//cin>>c>>k;
getchar();
scanf("%c",&c);
scanf("%d",&k);
//cout<<"++++"<<c<<endl;
switch(c)
{
int temp;
case 'I':
if(k<m)
break;
else
k-=u,tot++,insert(root,k);
break;
case 'A':
u+=k;
break;
case 'S':
u-=k;
temp=find(root,m-u-1);
if(temp)
delete_(temp);
break;
case 'F':
temp=ask(root,k);
if(k>tot-ans)
{
printf("%d\n",-1);
break;
}
//cout<<"temp"<<temp<<endl;
//cout<<"====="<<root<<endl;
//cout<<u<<' ';
printf("%d\n",temp?(u+value[temp]):(-1));
break;
}
}
printf("%d\n",ans);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: