传送门

经典的平衡树问题,之前已经用splay写过一次了,今天我突发奇想,写了一发非旋treap的版本,发现挺好写的(虽然跑不过splay)。

代码:

#include<bits/stdc++.h>
#define N 100005
using namespace std;
typedef pair<int,int> res;
int rt=0,n,m,cnt=0,son[N][2],siz[N],val[N],rd[N],rev[N];
inline int read(){
    int ans=0;
    char ch=getchar();
    while(!isdigit(ch))ch=getchar();
    while(isdigit(ch))ans=(ans<<3)+(ans<<1)+(ch^48),ch=getchar();
    return ans;
}
inline int build(int v){val[++cnt]=v,rd[cnt]=rand(),siz[cnt]=1,son[cnt][0]=son[cnt][1]=0;return cnt;}
inline void pushup(int p){siz[p]=siz[son[p][0]]+siz[son[p][1]]+1;}
inline void pushdown(int p){
    if(!rev[p])return;
    swap(son[p][0],son[p][1]);
    if(son[p][0])rev[son[p][0]]^=1;
    if(son[p][1])rev[son[p][1]]^=1;
    rev[p]^=1;
}
inline int merge(int a,int b){
    if(!a||!b)return a+b;
    pushdown(a),pushdown(b);
    if(rd[a]<rd[b]){son[a][1]=merge(son[a][1],b),pushup(a);return a;}
    son[b][0]=merge(a,son[b][0]),pushup(b);return b;
}
inline res split(int p,int k){
    if(!p)return res(0,0);
    res ans,tmp;
    pushdown(p);
    if(siz[son[p][0]]>=k){
        tmp=split(son[p][0],k);
        son[p][0]=tmp.second,pushup(p);
        ans.first=tmp.first,ans.second=p;
        return ans;
    }
    tmp=split(son[p][1],k-siz[son[p][0]]-1);
    son[p][1]=tmp.first,pushup(p);
    ans.first=p,ans.second=tmp.second;
    return ans;
}
inline int rank(int p,int k){
    if(!p)return 0;
    if(val[p]>k)return rank(son[p][0],k);
    return rank(son[p][1],k)+siz[son[p][0]]+1;
}
inline int build(int l,int r){
    if(l==r){siz[l]=1,rd[l]=rand(),son[l][0]=son[l][1]=0,val[l]=l;return l;}
    int mid=l+r>>1;
    return merge(build(l,mid),build(mid+1,r));
}
inline void update(int l,int r){
    res x=split(rt,l-1),y=split(x.second,r-l+1);
    rev[y.first]^=1;
    rt=merge(x.first,merge(y.first,y.second));
}
inline void print(int p){
    pushdown(p);
    if(son[p][0])print(son[p][0]);
    cout<<p<<' ';
    if(son[p][1])print(son[p][1]);
}
int main(){
    srand(time(NULL));
    n=read(),m=read();
    rt=build(1,n);
    while(m--){
        int l=read(),r=read();
        update(l,r);
    }
    print(rt);
    return 0;
}

2018.08.05 bzoj3223: Tyvj 1729 文艺平衡树(非旋treap)的更多相关文章

  1. BZOJ3223: Tyvj 1729 文艺平衡树 无旋Treap

    一开始光知道pushdown却忘了pushup......... #include<cstdio> #include<iostream> #include<cstring ...

  2. [BZOJ3223]Tyvj 1729 文艺平衡树

    [BZOJ3223]Tyvj 1729 文艺平衡树 试题描述 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:翻转一个区间,例如原有序序列是5 4 3 2 1,翻转区 ...

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

    3223: Tyvj 1729 文艺平衡树 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 3595  Solved: 2029[Submit][Sta ...

  4. bzoj3223 Tyvj 1729 文艺平衡树(Splay Tree+区间翻转)

    3223: Tyvj 1729 文艺平衡树 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 2202  Solved: 1226[Submit][Sta ...

  5. 2018.08.06 bzoj1500: [NOI2005]维修数列(非旋treap)

    传送门 平衡树好题. 我仍然是用的fhqtreap,感觉速度还行. 维护也比线段树splay什么的写起来简单. %%%非旋treap大法好. 代码: #include<bits/stdc++.h ...

  6. BZOJ3223——Tyvj 1729 文艺平衡树

    1.题目大意:维护序列,只有区间翻转这个操作 2.分析:splay的经典操作就是实现区间翻转,就是在splay中有一个标记,表示这个区间被翻转了 然后就是记得各种的操作访问某个点时,记得下传,顺便交换 ...

  7. bzoj3223: Tyvj 1729 文艺平衡树 splay裸题

    splay区间翻转即可 /************************************************************** Problem: 3223 User: walf ...

  8. 【Splay】bzoj3223 Tyvj 1729 文艺平衡树

    #include<cstdio> #include<iostream> #include<cstring> #include<algorithm> #i ...

  9. 【Splay】【块状链表】bzoj3223 Tyvj 1729 文艺平衡树

    让蒟蒻见识到了常数大+滥用STL的危害. <法一>很久之前的Splay #include<cstdio> #include<algorithm> using nam ...

随机推荐

  1. Laravel之Eloquent ORM

    一.ORM编程思想 1.1 Active Record 设计模式 Active Record 是一种数据访问设计模式,它可以帮助你实现数据对象Object到关系数据库的映射.应用Active Reco ...

  2. mysql 修改用户密码

    修改mysql用户密码   目录 mysqladmin命令 UPDATE user 语句 SET PASSWORD 语句 root密码丢失的情况(待验证) mysqladmin命令(回目录) 格式如下 ...

  3. ant 注意

    nt文件在部署时,如果控制台出现乱码则需要调整语言. 高版本eclipse在jdk高版本中已经植入了ant的部署.因此不需要单独配置ant.jar. 如果版本低,可下载ant插件,或者下载ant的工具 ...

  4. iOS开发-常用第三方开源框架介绍(你了解的ios只是冰山一角)--(转)

    图像: 1.图片浏览控件MWPhotoBrowser 实现了一个照片浏览器类似 iOS 自带的相册应用,可显示来自手机的图片或者是网络图片,可自动从网络下载图片并进行缓存.可对图片进行缩放等操作. 下 ...

  5. Delphi中拖动的方式来移动TPageControl的Tab

    procedure TMainForm.PageControl1MouseDown(Sender: TObject;   Button: TMouseButton; Shift: TShiftStat ...

  6. ArcGIS案例学习1_2

    ArcGIS案例学习1_2 联系方式:谢老师,135_4855_4328, xiexiaokui#qq.com 时间:第一天下午 案例1:矢量提取,栅格提取和坐标系投影变换 目的:认识数据类型 教程: ...

  7. ECMAScript6新特性之继承

    class Animal{ constructor(name){ this.name = name; } get name(){ return this._name; } set name(val){ ...

  8. phpStudy1——PHP文件获取html提交的参数

    示例代码: submit.html <!DOCTYPE html> <html> <head> <meta charset="UTF-8" ...

  9. 罗马数字转整数 · Roman to Integer

    13. Roman to Integer [抄题]: [暴力解法]: 时间分析: 空间分析: [思维问题]: 没有想到罗马字是逆序的情况 没有想到要先用toCharArray()方法把字符串拆成一个字 ...

  10. N皇后问题12 · N-Queens

    [抄题]: n皇后问题是将n个皇后放置在n*n的棋盘上,皇后彼此之间不能相互攻击. 给定一个整数n,返回所有不同的n皇后问题的解决方案. 每个解决方案包含一个明确的n皇后放置布局,其中“Q”和“.”分 ...