平衡树10分求改
查看原帖
平衡树10分求改
530797
code_hyx楼主2023/1/9 11:18

样例过了,但只对一个点:

#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;
}
2023/1/9 11:18
加载中...