Problem Description
YaoYao is fond of playing his chains. He has a chain containing n diamonds on it. Diamonds are numbered from
At first, the diamonds on the chain is a sequence:
He will perform two types of operations:
CUT
For example, if
FLIP
For example, if we perform “FLIP
He wants to know what the chain looks like after perform
Input
There will be multiple test cases in a test data.
For each test case, the first line contains two numbers:
Then m lines follow, each line contains one operation. The command is like this:
CUT
FLIP
The input ends up with two negative numbers, which should not be processed as a case.
Output
For each test case, you should print a line with
Sample Input
8 2
CUT 3 5 4
FLIP 2 6
-1 -1
Sample Output
1 4 3 7 6 2 5 8
Source
2010 ACM-ICPC Multi-University Training Contest(5)——Host by BJTU
Recommend
zhengfeng | We have carefully selected several similar problems for you: 3486 3479 3480 3481 3482
题目大意
就是说给你一串项链,初始时宝石为
思路
splay直接操作。
代码
#include <cstdio>
#include <cstring>
const int maxn=300000;
int n;
struct splay_tree
{
int fa[maxn+10],son[2][maxn+10],size[maxn+10],rev[maxn+10],root;
inline int t(int x)
{
return son[1][fa[x]]==x;
}
inline int push_rev(int x)
{
rev[x]^=1;
int t=son[0][x];
son[0][x]=son[1][x];
son[1][x]=t;
return 0;
}
inline int pushdown(int x)
{
if(rev[x])
{
if(son[0][x])
{
push_rev(son[0][x]);
}
if(son[1][x])
{
push_rev(son[1][x]);
}
rev[x]=0;
}
return 0;
}
inline int updata(int x)
{
return size[x]=size[son[0][x]]+size[son[1][x]]+1;
}
inline int rotate(int x)
{
int k=t(x),f=fa[x];
if(fa[f])
{
son[t(f)][fa[f]]=x;
}
fa[x]=fa[f];
if(son[!k][x])
{
fa[son[!k][x]]=f;
}
son[k][f]=son[!k][x];
fa[f]=x;
son[!k][x]=f;
updata(f);
updata(x);
return 0;
}
inline int splay(int x,int c)
{
while(fa[x]!=c)
{
int f=fa[x];
if(fa[f]==c)
{
rotate(x);
}
else if(t(x)==t(f))
{
rotate(f);
rotate(x);
}
else
{
rotate(x);
rotate(x);
}
}
if(!c)
{
root=x;
}
return 0;
}
inline int getkth(int x)
{
int now=root;
while(now)
{
pushdown(now);
if(size[son[0][now]]+1==x)
{
return now;
}
else if(size[son[0][now]]+1<x)
{
x-=size[son[0][now]]+1;
now=son[1][now];
}
else
{
now=son[0][now];
}
}
return 0;
}
int build(int l,int r)
{
int mid=(l+r)>>1;
rev[mid]=0;
size[mid]=r-l+1;
if(l<=mid-1)
{
son[0][mid]=build(l,mid-1);
fa[son[0][mid]]=mid;
}
if(mid+1<=r)
{
son[1][mid]=build(mid+1,r);
fa[son[1][mid]]=mid;
}
return mid;
}
inline int cut(int l,int r,int x)
{
int now;
if(l==1)
{
if(r==n)
{
now=root;
root=0;
}
else
{
int w=getkth(r+1);
splay(w,0);
now=son[0][w];
son[0][w]=0;
fa[now]=0;
updata(w);
}
}
else
{
int w=getkth(l-1);
splay(w,0);
if(r==n)
{
now=son[1][w];
son[1][w]=0;
fa[now]=0;
}
else
{
int y=getkth(r+1);
splay(y,w);
now=son[0][y];
son[0][y]=0;
fa[now]=0;
updata(y);
}
updata(w);
}
if(!x)
{
if(!root)
{
root=now;
}
else
{
int w=getkth(1);
splay(w,0);
son[0][w]=now;
fa[now]=w;
updata(w);
}
}
else
{
int w=getkth(x);
splay(w,0);
if(x==n-(r-l+1))
{
son[1][w]=now;
fa[now]=w;
}
else
{
int y=getkth(x+1);
splay(y,w);
son[0][y]=now;
fa[now]=y;
updata(y);
}
updata(w);
}
return 0;
}
inline int reverse(int l,int r)
{
if(l==1)
{
if(r==n)
{
push_rev(root);
}
else
{
int x=getkth(r+1);
splay(x,0);
push_rev(son[0][x]);
}
}
else
{
int x=getkth(l-1);
splay(x,0);
if(r==n)
{
push_rev(son[1][x]);
}
else
{
int y=getkth(r+1);
splay(y,x);
push_rev(son[0][y]);
}
}
return 0;
}
inline int mem()
{
memset(fa,0,sizeof fa);
memset(son,0,sizeof son);
memset(size,0,sizeof size);
memset(rev,0,sizeof rev);
return 0;
}
};
splay_tree st;
int m,a,b,c;
char s[10];
int main()
{
while(1)
{
st.mem();
scanf("%d%d",&n,&m);
if((n<0)&&(m<0))
{
break;
}
st.build(1,n);
st.root=(n+1)>>1;
while(m--)
{
scanf("%s%d%d",s,&a,&b);
if(s[0]=='C')
{
scanf("%d",&c);
st.cut(a,b,c);
}
else
{
st.reverse(a,b);
}
}
for(register int i=1; i<n; ++i)
{
printf("%d ",st.getkth(i));
}
printf("%d\n",st.getkth(n));
}
return 0;
}