BZOJ 3223 Splay区间翻转

原创 2017年01月03日 10:29:53

思路:
区间翻转的裸题 终于tm理解splay了……

//By SiriusRen
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define N 155555
int n,m,root,size[N],ch[N][2],fa[N],rev[N],v[N];
void push_up(int x){size[x]=size[ch[x][0]]+size[ch[x][1]]+1;}
int build(int l,int r){
    if(l>r)return 0;
    if(l==r){size[l]=1,v[l]=l-1;return l;}
    int mid=(l+r)>>1;v[mid]=mid-1;
    ch[mid][0]=build(l,mid-1);fa[ch[mid][0]]=mid;
    ch[mid][1]=build(mid+1,r);fa[ch[mid][1]]=mid;
    push_up(mid);
    return mid;
}
void rotate(int p){
    int q=fa[p],y=fa[q],f=(ch[q][1]==p);
    ch[q][f]=ch[p][!f],fa[ch[q][f]]=q;
    ch[p][!f]=q;fa[q]=p;fa[p]=y;
    if(y){
        if(ch[y][0]==q)ch[y][0]=p;
        else ch[y][1]=p;
    }push_up(q);
}
void Splay(int x,int tp){
    for(int y;y=fa[x];rotate(x)){
        if(y==tp)break;
        if(fa[y]!=tp){
            if((ch[y][0]==x)^(ch[fa[y]][0]==y))rotate(x);
            else rotate(y);
        }
    }push_up(x);
    if(!tp)root=x;
}
void push_down(int x){
    if(rev[x]){
        rev[ch[x][0]]^=1,rev[ch[x][1]]^=1;
        swap(ch[x][0],ch[x][1]);
        rev[x]=0;
    }
}
int find(int x,int num){
    push_down(x);
    int sz=size[ch[x][0]];
    if(sz+1==num)return x;
    else if(sz+1>num)return find(ch[x][0],num);
    else return find(ch[x][1],num-sz-1);
}
void reverse(int l,int r){
    int y=find(root,l);Splay(y,0);
    Splay(find(root,r+2),y);
    rev[ch[ch[root][1]][0]]^=1;
}
void dfs(int x){
    push_down(x);
    if(ch[x][0])dfs(ch[x][0]);
    if(v[x]&&v[x]!=n+1)printf("%d ",v[x]);
    if(ch[x][1])dfs(ch[x][1]);
}
int main(){
    scanf("%d%d",&n,&m);
    root=build(1,n+2);
    for(int i=1;i<=m;i++){
        int l,r;
        scanf("%d%d",&l,&r);
        reverse(l,r);
    }
    dfs(root);
}

这里写图片描述

版权声明:本文由SiriusRen原创,未经允许不得转载

splay区间翻转及删除区间,平移区间

研究了很长时间,花费了一个下午debug,终于调出来了 hdu 3487 play with chain http://acm.hdu.edu.cn/showproblem.php?pid=348...
  • nikelong0
  • nikelong0
  • 2015年12月06日 17:27
  • 1601

小练习,splay区间反转

一道codevs的区间翻转问题。 http://codevs.cn/problem/1743/ 题意,每次找最左边的数,令为k:   k=1,结束;  否则,ans++,翻转[1,k]. (给定...
  • nikelong0
  • nikelong0
  • 2015年12月11日 09:40
  • 773

Splay tree 区间翻转 模板

Splay作为二叉平衡树与其他二叉平衡树不同的是,Splay能够支持区间操作。最然可持续化Treap也可以做到,但是代码量实在是难以同日而语。 放一个模板,只支持区间翻转。想看其他操作的可以看我的 ...
  • jiangyuze831
  • jiangyuze831
  • 2014年09月06日 20:19
  • 1105

新技能:splay支持区间翻转,区间插入,区间删除

splay加两个哨兵左一个,右一个。这样便于提取区间。 建树时就一直放在前一个节点的右儿子即可,然后找一个中间的点splay到根 find操作支持找到区间当前第x位 提取区间:把l-1位上...
  • Timsei
  • Timsei
  • 2017年07月10日 08:03
  • 410

【数据结构SPLAY】splay区间翻转,区间和查询,区间插入,区间删除,区间修改

#include #include #include #define maxn (200005) using namespace std; int ch[maxn][2],val[maxn],size...
  • DERITt
  • DERITt
  • 2016年01月08日 19:50
  • 1270

Codevs_P2048 数据结构 2(SplayTree区间翻转)

传送门 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description 给一个长为N的数列,有M次操作 每次操作是将指定子序列原地...
  • qq_18455665
  • qq_18455665
  • 2016年02月04日 15:14
  • 571

BZOJ 3223 浅谈SPLAY伸展树算法区间翻转

世界真的很大 SPLAY是个很厉害的数据结构,相对于其他平衡树,比如treap,对于每一次查询虽然常数偏大,但是却能力保总复杂度趋近于nlogn,而且除了treap能支持的操作以外,还支持如区间翻转...
  • BerryKanry
  • BerryKanry
  • 2017年07月19日 20:06
  • 311

BZOJ_P3223&Tyvj_P1729 文艺平衡树(SplayTree区间翻转)

传送门 Time Limit: 10 Sec Memory Limit: 128 MB Submit: 2445 Solved: 1368 [Submit][Status][Discuss]...
  • qq_18455665
  • qq_18455665
  • 2016年02月04日 15:19
  • 349

区间翻转 bzoj 3223 文艺平衡树 (splay)

【bzoj3223】Tyvj 1729 文艺平衡树Description 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:翻转一个区间,例如原有序序列是5 4 3 ...
  • w4149
  • w4149
  • 2017年05月26日 17:20
  • 320

Splay树(区间添加删除 | 区间翻转)——HDU 3487 Play with Chain

Splay树——HDU 3487 Play with Chain
  • u013351484
  • u013351484
  • 2015年06月04日 20:33
  • 963
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:BZOJ 3223 Splay区间翻转
举报原因:
原因补充:

(最多只允许输入30个字)