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;
}