新手splay死循环!!!

P3391 【模板】文艺平衡树

zMinYu @ 2023-04-19 22:10:53

问题貌似处在splay函数上。

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
struct node
{
    int s[2],size,p,v,flag;
    void init(int _v,int _p)
    {
        v=_v;
        p=_p;
        size=1;
    }
}tr[N];
int m,n,root,idx;
void pushdown(int u)
{
    if(tr[u].flag)
    {
        swap(tr[u].s[0],tr[u].s[1]);
        tr[tr[u].s[0]].flag^=1;
        tr[tr[u].s[1]].flag^=1;
        tr[u].flag=0;
    }
}
void pushup(int u)
{
    tr[u].size=tr[tr[u].s[0]].size+tr[tr[u].s[1]].size+1;
}
void rotate(int x)
{
    int y=tr[x].p,z=tr[y].p;
    int k=(tr[x].s[1]==x); //父子关系 
    tr[x].p=z,tr[z].s[tr[z].s[1]==y]=x;
    tr[tr[x].s[k^1]].p=y,tr[y].s[k]=tr[x].s[k^1];
    tr[y].p=x,tr[x].s[k^1]=y;
    pushup(y);
    pushup(x);
}
void splay(int x,int k)
{
    while(tr[x].p!=k)
    {
        int y=tr[x].p,z=tr[y].p;
        if(z!=k)
        {
            //异或,相同为false
            if((y==tr[z].s[1])^(x==tr[y].s[1])) rotate(x); //直线 
            else rotate(y); //折线 
        }
        rotate(x);
        cout<<x<<endl;
    }
    if(!k) root=x;
}
void insert(int k)
{
    int u=root,p=0; //p是u的爹
    while(u) p=u,u=tr[u].s[k>tr[u].v];
    u=++idx;
    tr[u].init(k,p);
    if(p)
    {
        tr[p].s[k>tr[u].v]=u;
        tr[k].p=p;
    } 
    splay(u,0);
}
void out(int u)
{
    pushdown(u);
    if(tr[u].s[0]) out(tr[u].s[0]);
    if(tr[u].v>=1&&tr[u].v<=n) printf("%d ",tr[u].v);
    if(tr[u].s[1]) out(tr[u].s[1]);
}
int get_rank(int x)
{
    int u=root;
    while(1)
    {
        pushdown(u);
        if(tr[tr[u].s[0]].size+1==x) return u;
        else if(x>tr[tr[u].s[0]].size+1) x-=tr[tr[u].s[0]].size+1,u=tr[u].s[1];
        else u=tr[u].s[0];
    }
}
int main()
{
    cin>>n>>m;
    for(int i=0;i<=n+1;i++)
    {
        insert(i);
    } 
    while(m--)
    {
        int l,r;
        cin>>l>>r;
        l=get_rank(l),r=get_rank(r+2);
        splay(l,0);
        splay(r,l);
        tr[tr[r].s[0]].flag^=1;
    }
    out(root);
    return 0;
} 

by adam01 @ 2023-04-19 22:46:43

rotate和insert函数打错了: 第32行的 int k=(tr[x].s[1]==x); 应改为 int k=(tr[y].s[1]==x);

第64行的 tr[k].p=p; 可以删去(已经init过了)或者改为 tr[u].p=p;


by adam01 @ 2023-04-19 22:47:13

@jiuchaozhiyuan


by adam01 @ 2023-04-19 22:49:21

哦对了还有63行 tr[p].s[k>tr[u].v]=u; 要改为 tr[p].s[k>tr[p].v]=u;


by zMinYu @ 2023-04-20 09:42:58

@adam01 谢谢大佬!!!!


by zMinYu @ 2023-04-20 09:43:18

过了!!


|