您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:翻转一个区间,例如原有序序列是5 4 3 2 1,翻转区间是[2,4]的话,结果是5 2 3 4 1
您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:翻转一个区间,例如原有序序列是5 4 3 2 1,翻转区间是[2,4]的话,结果是5 2 3 4 1
第一行为n,m n表示初始序列有n个数,这个序列依次是(1,2……n-1,n) m表示翻转操作次数
接下来m行每行两个数[l,r] 数据保证 1<=l<=r<=n
输出一行n个数字,表示原始序列经过m次变换后的结果
N,M<=100000
平衡树
平衡树区间反转模板
【代码】
#include<iostream> #include<cstring> #include<cstdio> using namespace std; #define MAXN 110000 #define INF 1000000000 int ch[MAXN][2],f[MAXN],size[MAXN],key[MAXN],delta[MAXN],a[MAXN]; int n,m,x,y,sz,root; inline void update(int x){ size[x]=size[ch[x][0]]+size[ch[x][1]]+1; } inline bool get(int x){ return ch[f[x]][1]==x; } inline void pushdown(int x){ if (x&&delta[x]){ delta[ch[x][0]]^=1; delta[ch[x][1]]^=1; swap(ch[x][0],ch[x][1]); delta[x]=0; } } inline int build(int left,int right,int fa){ if (left>right) return 0; int mid=(left+right)>>1; int now=++sz; key[now]=a[mid]; f[now]=fa; delta[now]=0; int leftchild=build(left,mid-1,now); int rightchild=build(mid+1,right,now); ch[now][0]=leftchild; ch[now][1]=rightchild; update(now); return now; } inline void rotate(int x){ pushdown(f[x]); pushdown(x); int old=f[x],oldf=f[old],which=get(x); ch[old][which]=ch[x][which^1]; f[ch[old][which]]=old; ch[x][which^1]=old; f[old]=x; f[x]=oldf; if (oldf) ch[oldf][ch[oldf][1]==old]=x; update(old); update(x); } inline void splay(int x,int tar){ for (int fa;(fa=f[x])!=tar;rotate(x)) if (f[fa]!=tar) rotate((get(x)==get(fa))?fa:x); if (tar==0) root=x; } inline int find(int x){ int now=root; while(1){ pushdown(now); if (x<=size[ch[now][0]]) now=ch[now][0]; else{ x-=size[ch[now][0]]+1; if (x==0) return now; now=ch[now][1]; } } } inline void print(int now){ pushdown(now); if (ch[now][0]) print(ch[now][0]); if (key[now]!=INF&&key[now]!=-INF) printf("%d ",key[now]); if (ch[now][1]) print(ch[now][1]); } int main(){ scanf("%d%d",&n,&m); a[1]=-INF; a[n+2]=INF; for (int i=1;i<=n;++i) a[i+1]=i; root=build(1,n+2,0); for (int i=1;i<=m;++i){ scanf("%d%d",&x,&y); if (x>=y) continue; int aa=find(x); int bb=find(y+2); splay(aa,0); splay(bb,aa); delta[ch[ch[root][1]][0]]^=1; } print(root); printf("\n"); }