再次求助

P3391 【模板】文艺平衡树

xiaolou @ 2019-03-28 20:15:59

挑出来了好几个问题,但是样例还是RE。。。

#include <bits/stdc++.h>

using namespace std;
struct Node
{
    int sz,v,d,f;
    Node *s[2],*fa;
}pool[100005],*root;
int Size(Node *p)
{
    int size=1;
    if(p==NULL) 
    {
        return 0;
    }
    if(p->s[0]) 
    {
        size+=p->s[0]->sz;
    }
    if(p->s[1]) 
    {
        size+=p->s[1]->sz;
    }
    return size;
}
void Pushdown(Node *p)
{
    if(p->f==1&&p!=NULL)
    {
        swap(p->s[0],p->s[1]);
        if(p->s[0])
        {
            p->s[0]->f=1-p->s[0]->f;
        }
        if(p->s[1])
        {
            p->s[1]->f=1-p->s[1]->f;
        }
        p->f=0;
    }
}
void Update(Node *p)
{
    p->sz=Size(p->s[0])+Size(p->s[1])+1 ;
}
void Rotate(Node *p)
{
    int k=(p->fa->s[1]==p);
    Node *fa=p->fa;
    Node *gf=p->fa->fa;
    Node *son=p->s[!k];
    fa->s[k]=son;
    if(son)
    {
        son->fa=fa;
    }
    fa->fa=p;
    p->s[!k]=fa;
    p->fa=gf;
    if(gf)
    {
        if(gf->s[1]==fa)
        {
            gf->s[1]=p;
        }
        else
        {
            gf->s[0]=p;
        }
    }
    if(root==fa)
    {
        root=p;
    }
    Update(fa);
    Update(p);
}
Node *Kth(Node *p,int x)
{
    Pushdown(p);
    if(Size(p->s[0])+1==x)
    { 
        return p;
    }
    else if(Size(p->s[0])+1>x)
    {
        return Kth(p->s[0],x);
    }
    else 
    {
        return Kth(p->s[1],x-Size(p->s[0])-1);
    }
}
void Splay(Node *p,Node *target)
{
    while(p->fa!=target)
    {
        if(p->fa->fa==target)
        {
            Rotate(p);
        }
        else
        {
            Node *fa=p->fa,*gp=fa->fa;
            int k=(gp->s[1]==fa);
            if(fa->s[k]==p)
            {
                Rotate(fa);
                Rotate(p);
            }
            else 
            {
                Rotate(p);
                Rotate(p);
            }
        }
    }
}    
int cnt=0;
void Reverse(int x,int y)
{
    Node *l=Kth(root,x-1);
    Node *r=Kth(root,y+1);
    Splay(l,NULL);
    Splay(r,root);
    if(root->s[1]->s[0])
    {
        root->s[1]->s[0]->f^=1;
    }
}
void Inorder(Node *p)
{
    if(p->s[0])
    {
        Inorder(p->s[0]);
    }
    printf("%d ",p->v);
    if(p->s[1])
    {
        Inorder(p->s[1]);
    }
}
void Insert(int x)
{
    Node *p=&pool[++cnt];
    Node *p1=Kth(root,x-1);
    Splay(p1,NULL);
    root->s[1]=p;
    p->v=x;
    p->d=x+1;
    p->sz=1;
    p->fa=root;
    Update(p);
    Update(root);
}

int main()
{
    int n,m;
    scanf("%d%d",&n,&m);
    root=&pool[++cnt];
    root->v=-100000000;
    root->d=1;
    root->sz=1;
    for(int i=2;i<=n+2;++i)
    {
        Insert(i);
    }
    for(int i=1;i<=m;++i)
    {
        int a,b;
        cin >> a >> b;
        Reverse(a,b);
    }
    Inorder(root);
    return 0;
}

by ecnerwaIa @ 2019-03-28 20:31:38

@xiaolou 我来了


by ecnerwaIa @ 2019-03-28 20:33:38

@xiaolou size()函数不要,因为你写了sz


by ecnerwaIa @ 2019-03-28 20:36:09

@xiaolou 你代码的问题不是一点啊


by Leap_Frog @ 2019-03-28 21:26:45

%%%%%%%%%%%%
%%%%%%%%%%%%
%%%%%%%%%%%%


by Leap_Frog @ 2019-03-28 21:26:58

太强了!!!


|