首页 > 代码库 > BZOJ3223: Tyvj 1729 文艺平衡树 [splay]

BZOJ3223: Tyvj 1729 文艺平衡树 [splay]

您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:翻转一个区间,例如原有序序列是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 


 

////  main.cpp//  文艺平衡树////  Created by Candy on 28/11/2016.//  Copyright © 2016 Candy. All rights reserved.//#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>#include <cmath>using namespace std;#define pa t[x].fa#define lc t[x].ch[0]#define rc t[x].ch[1]const int N=1e5+5;inline int read(){    char c=getchar();int x=0,f=1;    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;}struct node{    int ch[2],fa,w,size;    int flp;}t[N];int cnt,root;inline int wh(int x){return t[pa].ch[1]==x;}inline void update(int x){t[x].size=t[lc].size+t[rc].size+t[x].w;}inline void pushDown(int x){    if(t[x].flp){        swap(lc,rc);        t[lc].flp^=1;t[rc].flp^=1;        t[x].flp=0;    }}int build(int l,int r){    if(l>r) return 0;    int x=(l+r)>>1;    lc=build(l,x-1);rc=build(x+1,r);    t[lc].fa=t[rc].fa=x;    t[x].w=1;t[x].flp=0;    update(x);    return x;}void rotate(int x){    int f=t[x].fa,g=t[f].fa,c=wh(x);    if(g) t[g].ch[wh(f)]=x;    t[f].ch[c]=t[x].ch[c^1];t[t[f].ch[c]].fa=f;    t[x].ch[c^1]=f;t[f].fa=x;    t[x].fa=g;    update(f);update(x);}void splay(int x,int tar){    for(;t[x].fa!=tar;rotate(x))        if(t[pa].fa!=tar) rotate(wh(x)==wh(pa)?pa:x);    if(tar==0) root=x;}int kth(int k){    int x=root,ls=0;    while(x!=0){        pushDown(x);        int _=ls+t[lc].size;        if(_<k&&k<=_+t[x].w) return x;        if(k<=_) x=lc;        else ls=_+t[x].w,x=rc;    }    return -1;}int n,m,l,r;void print(int x){    if(x==0) return;    pushDown(x);    if(lc) print(lc);    if(x!=1&&x!=n+2) printf("%d ",x-1);    if(rc) print(rc);}int main(int argc, const char * argv[]) {    n=read();m=read();    root=build(1,n+2);    while(m--){        l=read();r=read();        splay(kth(l),0);        int x=kth(r+2);        splay(x,root);        t[lc].flp^=1;    }    print(root);    return 0;}

 

 

 

BZOJ3223: Tyvj 1729 文艺平衡树 [splay]