样例过了,但只对一个点:
#include<bits/stdc++.h>
using namespace std;
struct node
{
int prt;
int l;
int r;
int ls;
int rs;
int val;
int sum;
};
node treet[200005];
int n,gen,ans,cnt=0,flag=0,a[200005];
void rightt(int x)
{
int y=treet[x].prt;
int z=treet[y].prt;
treet[y].l=treet[x].r;
if(treet[x].r)treet[treet[x].r].prt=y;
treet[x].prt=z;
if(z)
{
if(treet[z].l==y)treet[z].l=x;
else treet[z].r=x;
}
treet[x].r=y;
treet[y].prt=x;
treet[y].ls=treet[x].rs;
treet[x].rs=treet[y].ls+treet[y].rs+1;
}
void leftt(int x)
{
int y=treet[x].prt;
int z=treet[y].prt;
treet[y].r=treet[x].l;
if(treet[x].l)treet[treet[x].l].prt=y;
treet[x].prt=z;
if(z)
{
if(treet[z].l==y)treet[z].l=x;
else treet[z].r=x;
}
treet[x].l=y;
treet[y].prt=x;
treet[y].rs=treet[x].ls;
treet[x].ls=treet[y].ls+treet[y].rs+1;
}
void splay(int x)
{
while(treet[x].prt!=0)
{
//cout<<"tr:"<<treet[x].prt<<"\n";
int y=treet[x].prt;
int z=treet[y].prt;
if(z==0)
{
if(treet[y].l==x)rightt(x);
else leftt(x);
break;
}
else
{
if(treet[y].l==x&&treet[z].l==y)
{
rightt(y);
rightt(x);
}
if(treet[y].r==x&&treet[z].r==y)
{
leftt(y);
leftt(x);
}
if(treet[y].r==x&&treet[z].l==y)
{
leftt(x);
rightt(x);
}
if(treet[y].l==x&&treet[z].r==y)
{
rightt(x);
leftt(x);
}
}
}
gen=x;
return;
}
void ins(int x)
{
int p=gen;
int tp;
while(p!=0)
{
tp=p;
if(x<=treet[p].val)
{
p=treet[p].l;
treet[tp].l++;
}
else
{
p=treet[p].r;
treet[tp].r++;
}
}
cnt++;
treet[cnt].val=x;
treet[cnt].sum=1;
treet[cnt].prt=treet[cnt].l=treet[cnt].r=treet[cnt].ls=treet[cnt].rs=0;
//cout<<"what's wrong\n";
if(gen==0)gen=cnt;
else
{
treet[cnt].prt=tp;
if(x<=treet[tp].val)treet[tp].l=cnt;
else treet[tp].r=cnt;
splay(cnt);
}
}
int fd(int x)
{
int xx=gen;
//cout<<xx<<"\n";
while(xx!=0)
{
//cout<<"ok\n";
if(x==treet[xx].val)
{
//cout<<"splay!\n";
splay(xx);
treet[xx].sum++;
return 1;
}
if(x<treet[xx].val)xx=treet[xx].l;
else xx=treet[xx].r;
}
//cout<<"finish!\n";
return 0;
}
void printans(int x)
{
//cout<<x<<"\n";
if(treet[x].l!=0)printans(treet[x].l);
cout<<treet[x].val<<" "<<treet[x].sum<<"\n";
if(treet[x].r!=0)printans(treet[x].r);
}
int main()
{
//ios::sync_with_stdio(false);
//cin.tie(0);
//cout.tie(0);
cin>>n;
for(int i=1;i<=n;i++)
{
//cout<<"i="<<i<<"\n";
cin>>a[i];
if(fd(a[i]))continue;
else ins(a[i]);
}
printans(gen);
return 0;
}