[BZOJ 3223]Tyvj 1729 文藝平衡樹(Splay)

Description


您需要寫一種數據結構(可參考題目標題),來維護一個有序數列,其中需要提供以下操作:翻轉一個區間,例如原有序序列是5 4 3 2 1,翻轉區間是[2,4]的話,結果是5 2 3 4 1

Input


第一行爲n,m n表示初始序列有n個數,這個序列依次是(1,2……n-1,n) m表示翻轉操作次數
接下來m行每行兩個數[l,r] 數據保證 1<=l<=r<=n

Output


輸出一行n個數字,表示原始序列經過m次變換後的結果

Sample Input


5 3
1 3
1 3
1 4

Sample Output


4 3 2 1 5

HINT


N,M<=100000

Solution


發現自己數據結構超·級·弱
存代碼

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#define MAXN 100005
using namespace std;
int n,m,siz=0,root;
struct Node{
    int key,ch[2],siz,father,rev;
}t[MAXN];
int Read()
{
    int f=1,x=0;char c=getchar();
    while(c<'0'||c>'9'){
        if(c=='-')f=-1;c=getchar();
    }
    while(c>='0'&&c<='9'){
        x=x*10+c-'0';c=getchar();
    }
    return x*f;
}
void Update(int x)
{
    t[x].siz=t[t[x].ch[0]].siz+t[t[x].ch[1]].siz+1;
}
void Pushdown(int x)
{
    if(x&&t[x].rev)
    {
        t[x].rev=0;
        t[t[x].ch[0]].rev^=1;
        t[t[x].ch[1]].rev^=1;
        swap(t[x].ch[0],t[x].ch[1]);
    }
}
void Rotate(int x,int &k)
{
    int y=t[x].father;
    int z=t[y].father;
    int p=(x==t[y].ch[0])?0:1;
    if(y==k)k=x;
    else{
        if(t[z].ch[0]==y)t[z].ch[0]=x;
        else t[z].ch[1]=x;
    }
    t[x].father=z;
    t[y].ch[p]=t[x].ch[p^1];
    t[t[x].ch[p^1]].father=y;
    t[x].ch[p^1]=y;
    t[y].father=x;
    Update(x),Update(y);
}
void Splay(int x,int &k)
{
    while(x!=k)
    {
        int y=t[x].father;
        int z=t[y].father;
        if(y!=k)
        {
            if((x==t[y].ch[0])^(y==t[z].ch[0]))
            Rotate(x,k);
            else Rotate(y,k);
        }
        Rotate(x,k);
    }
}
int Build(int l,int r,int f)
{
    if(l>r)return 0;
    int mid,now;
    mid=(l+r)/2;
    siz++,now=siz;
    t[now].father=f,t[now].key=mid;
    t[now].ch[0]=Build(l,mid-1,now);
    t[now].ch[1]=Build(mid+1,r,now);
    Update(now);
    return now;
}
int Find(int x,int k)
{
    if(!k)return 0;
    Pushdown(k);
    if(x<=t[t[k].ch[0]].siz)Find(x,t[k].ch[0]);
    else if(x>t[t[k].ch[0]].siz+1)
    Find(x-t[t[k].ch[0]].siz-1,t[k].ch[1]);
    else return k;
}
void Print(int x)
{
    if(!x)return;
    Pushdown(x);
    Print(t[x].ch[0]);
    if(t[x].key!=1&&t[x].key!=n+2)
    printf("%d ",t[x].key-1);
    Print(t[x].ch[1]);
}
int main()
{
    n=Read();m=Read();
    root=Build(1,n+2,0);
    for(int i=1;i<=m;i++)
    {
        int l,r;
        l=Read();r=Read();
        int x=Find(l,root);
        int y=Find(r+2,root);
        Splay(x,root);Splay(y,t[root].ch[1]);
        root=x;
        t[t[t[root].ch[1]].ch[0]].rev^=1;
    }
    Print(root);
    return 0;
} 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章