[BZOJ]3223: Tyvj 1729 文艺平衡树

来源:互联网 发布:tomcat怎么配置数据库 编辑:程序博客网 时间:2024/06/05 05:09

3223: Tyvj 1729 文艺平衡树
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
Source
平衡树

来水一发无旋Treap

#include <cstdio>#include <cstdlib>#include <algorithm>using namespace std;typedef pair<int,int> P;inline char tc(void){    static char fl[1000000],*A=fl,*B=fl;    return A==B&&(B=(A=fl)+fread(fl,1,1000000,stdin),A==B)?EOF:*A++;}inline int read(void){    int a=0;static char c;    while((c=tc())<'0'||c>'9');    while(c>='0'&&c<='9')        a=a*10+c-'0',c=tc();    return a;}struct Treap{    int l,r,size,random;    bool rev;}tree[100002];int n,m,root;P x,y;void update(int x){    tree[x].size=1;    if(tree[x].l)        tree[x].size+=tree[tree[x].l].size;    if(tree[x].r)        tree[x].size+=tree[tree[x].r].size;    return ;}void pushdown(int x){    if(tree[x].l)         tree[tree[x].l].rev^=1;    if(tree[x].r)         tree[tree[x].r].rev^=1;    tree[x].rev=0,swap(tree[x].l,tree[x].r);    return ;}int merge(int u,int v){    if(!u||!v) return u^v;    if(tree[u].rev)        pushdown(u);    if(tree[v].rev)        pushdown(v);    if(tree[u].random<tree[v].random)    {        tree[u].r=merge(tree[u].r,v),update(u);        return u;    }    tree[v].l=merge(u,tree[v].l),update(v);    return v;}P split(int x,int n){    if(!n)        return P(0,x);    if(tree[x].rev)        pushdown(x);    if(n<=tree[tree[x].l].size)    {        P f=split(tree[x].l,n);        tree[x].l=f.second,        update(x);        return P(f.first,x);    }    P f=split(tree[x].r,n-tree[tree[x].l].size-1);    tree[x].r=f.first;    update(x);    return P(x,f.second);}void pri(int x){    if(tree[x].rev)        pushdown(x);    if(tree[x].l)        pri(tree[x].l);    printf("%d ",x);    if(tree[x].r)        pri(tree[x].r);    return ;}int main(void){    register int i,ql,qr;    n=read(),m=read();    for (i=1;i<=n;++i)        tree[i].size=1,tree[i].random=rand(),root=merge(root,i);    for (i=1;i<=m;++i)    {        ql=read(),qr=read();        x=split(root,ql-1);        y=split(x.second,qr-ql+1);        int x1=x.first,x2=x.second,y1=y.first,y2=y.second;        tree[y.first].rev^=1;        root=merge(x.first,merge(y.first,y.second));    }    pri(root);    return 0;}
原创粉丝点击