码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2016-11-29 06:57:15      阅读:162      评论:0      收藏:0      [点我收藏+]

标签:需要   tchar   etc   [1]   --   memory   表示   read   names   

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

标签:需要   tchar   etc   [1]   --   memory   表示   read   names   

原文地址:http://www.cnblogs.com/candy99/p/6112009.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
分享档案
周排行
mamicode.com排行更多图片
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!