一开始光知道pushdown却忘了pushup.........

#include<cstdio>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<queue>
#define MAXN 100010
using namespace std;
inline int read()
{
int sum=;
char ch=getchar();
while(ch<''||ch>'')ch=getchar();
while(ch>=''&&ch<='')
{
sum=(sum<<)+(sum<<)+ch-'';
ch=getchar();
}
return sum;
}
struct Treap
{
struct Node
{
Node *ch[];
int size,v,key;
bool rev;
void pushup()
{
size=ch[]->size+ch[]->size+;
}
}null[MAXN],*root,*q[MAXN];
void swap(Node *&x,Node *&y)
{
Node *temp=x;
x=y;
y=temp;
}
void pushdown(Node *p)
{
if(!p->rev)return;
p->ch[]->rev^=;
p->ch[]->rev^=;
swap(p->ch[],p->ch[]);
p->rev=;
}
int head,tail;
int sz;
Node *build(int l,int r)
{
if(l>r)return null;
int mid=(l+r)>>;
null[mid].ch[]=build(l,mid-);
null[mid].ch[]=build(mid+,r);
null[mid].pushup();
return &null[mid];
}
void bfs()
{
q[]=root;
head=tail=;
while(head<=tail)
{
Node *x=q[head++];
x->v=++sz;
if(x->ch[]!=null)q[++tail]=x->ch[];
if(x->ch[]!=null)q[++tail]=x->ch[];
}
}
void Init(int n)
{
null->ch[]=null->ch[]=null;
for(int i=;i<=n;i++)
null[i].ch[]=null[i].ch[]=null,null[i].size=,null[i].key=i;
root=build(,n);
bfs();
}
Node *Merge(Node *a,Node *b)
{
if(a==null)return b;
if(b==null)return a;
if(a->v<b->v)
{
pushdown(a);
a->ch[]=Merge(a->ch[],b);
a->pushup();
return a;
}
else
{
pushdown(b);
b->ch[]=Merge(a,b->ch[]);
b->pushup();
return b;
}
}
pair<Node*,Node*> split(Node *p,int k)
{
if(p==null)return make_pair(null,null);
pushdown(p);
if(p->ch[]->size>=k)
{
pair<Node*,Node*> y=split(p->ch[],k);
p->ch[]=y.second;
p->pushup();
y.second=p;
return y;
}
pair<Node*,Node*> y=split(p->ch[],k-p->ch[]->size-);
p->ch[]=y.first;
p->pushup();
y.first=p;
return y;
}
void Rev(int l,int r)
{
pair<Node*,Node*> x=split(root,l-);
pair<Node*,Node*> y=split(x.second,r-l+);
y.first->rev^=;
root=Merge(Merge(x.first,y.first),y.second);
}
void Print(Node *p)
{
pushdown(p);
if(p==null)return;
Print(p->ch[]);
printf("%d ",p->key);
Print(p->ch[]);
}
}YY;
int main()
{
int n=read(),m=read();
YY.Init(n);
while(m--)
{
int l=read(),r=read();
YY.Rev(l,r);
}
YY.Print(YY.root);
return ;
}

BZOJ3223: Tyvj 1729 文艺平衡树 无旋Treap的更多相关文章

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

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

  2. [BZOJ3223]文艺平衡树 无旋Treap

    3223: Tyvj 1729 文艺平衡树 Time Limit: 10 Sec  Memory Limit: 128 MB Description 您需要写一种数据结构(可参考题目标题),来维护一个 ...

  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.05 bzoj3223: Tyvj 1729 文艺平衡树(非旋treap)

    传送门 经典的平衡树问题,之前已经用splay写过一次了,今天我突发奇想,写了一发非旋treap的版本,发现挺好写的(虽然跑不过splay). 代码: #include<bits/stdc++. ...

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

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

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

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

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

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

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

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

随机推荐

  1. 微信小程序缓存

    购物车数据加入缓存,相同的商品值修改数量,然后再次加入缓存中 修改购物车的数据的时候同理,都是修改缓存数据然后加入到缓存中. 具体的使用方法看官方文档,我只是提供思路

  2. redis搭建

    redis 1.简介.安装 Remote Dictionary Server(Redis)是一个基于 key-value 键值对的持久化数据库存储系统.redis 和 Memcached 缓存服务很像 ...

  3. Spark-源码-SparkContext的初始化

    Spark版本 1.3SparkContext初始化流程 1.0 在我们的主类 main() 方法中经常会这么写 val conf = new SparkConf().setAppName(" ...

  4. python 函数 练习

    # 2.写函数,接收n个数字,求这些参数数字的和. def sum_func(*args): total = 0 for i in args: total += i return total prin ...

  5. (数据科学学习手札09)系统聚类算法Python与R的比较

    上一篇笔者以自己编写代码的方式实现了重心法下的系统聚类(又称层次聚类)算法,通过与Scipy和R中各自自带的系统聚类方法进行比较,显然这些权威的快捷方法更为高效,那么本篇就系统地介绍一下Python与 ...

  6. [Hbase]hbase命令行基本操作

    -进入hbase shell hbase shell - 帮助help help - 查看hbase versionversion - 查看hbase 状态 status - 创建表create 't ...

  7. 7 tftp

    1. TFTP协议介绍 TFTP(Trivial File Transfer Protocol,简单文件传输协议) 是TCP/IP协议族中的一个用来在客户端与服务器之间进行简单文件传输的协议 特点: ...

  8. 30分钟 带你浅入requirejs源码

    因为最近项目想现实一个单页功能,用的是react ,然后看了一下react route,挖槽 gzip后16k? 然后我简单写了一个纯单页(不支持多页的单页,所有入口都经过rewrite跑到index ...

  9. 今日Linux

    一.复习了vi 三个模式下的一些操作.贴上一些比较常用,个人觉得比较难记的操作.1.一般模式:h  光标向左移动一个字符j   光标向下移动一个字符K  光标向上移动一个字符l    光标向右移动一个 ...

  10. 问题 A: a+b

    问题 A: a+b 时间限制: 1 Sec  内存限制: 32 MB提交: 285  解决: 124[提交][状态][讨论版][命题人:外部导入] 题目描述 实现一个加法器,使其能够输出a+b的值. ...