一开始光知道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. YII2.0 获取当前访问地址/IP信息

    假设我们当前页面的访问地址是:http://localhost/CMS/public/index.php?r=news&id=1 一. 1.获取当前域名:echo Yii::app()-> ...

  2. Kubernetes-运维指南

    Node隔离与恢复 cat unschedule_node.yaml apiVersion: kind: Node metadata: name: k8s-node-1 labels: kuberne ...

  3. P3527 [POI2011]MET-Meteors

    P3527 [POI2011]MET-Meteors 链接 整体二分! 代码 #include<bits/stdc++.h> using namespace std; typedef lo ...

  4. No parser was explicitly specified, so I'm using the best available HTML parser for this system ("html.parser").警告解决方法

    在使用BeautifulSoup库时出现该警告,虽然不影响正常运行,但强迫症不能忍啊!! 详细警告信息如下: UserWarning: No parser was explicitly specifi ...

  5. cordova 框架下开发app推送

    cordova提供官方的push pluging,使用的是Google的GCM消息推送服务,一些网络原因,国内GCM可能不怎么好用.所以选择国内的第三方插件. 可供选择的有百度云推送,腾讯云信鸽,极光 ...

  6. 阴影效果的小 demo

    早上没事干,感觉字体阴影的效果还是好看的,那么就来一个小demo吧! 1.这是html 简单的有一个标签或者盒子都可以 <div class="demo11">我爱考试 ...

  7. Python 3基础教程26-多行打印

    本文来介绍多行打印.多行打印一般出现在欢迎界面,例如你玩过的游戏,第一个界面,很多文字显示. 我们随便打印几行,来模拟下这种多行打印情况. # 多行打印 print(''' 第一行内容 第二行内容 第 ...

  8. 【app.js】配置及App函数说明

    app.js中的App函数用来注册一个小程序或设置全局变量. App函数: 语法:App(Object)     参数: Object json对象     说明: App函数必须在app.js中调用 ...

  9. [Effective Python] 用Pythonic方式来思考

    Effective Python chap.1 用Pythonic方式来思考 Pythonic: 一门语言的编程习惯是由用户来确立的. 1. 确认自己所使用的Python版本 2. 遵循PEP8风格指 ...

  10. Visual Studio 2010安装包

    点击下载