BZOJ - 3223 Tyvj 1729 文艺平衡树 (splay/无旋treap)
splay:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e5+,inf=0x3f3f3f3f;
int ch[N][],val[N],siz[N],rev[N],tot,n,m,a[N],rt;
int newnode(int x) {int u=++tot; val[u]=x,siz[u]=,ch[u][]=ch[u][]=rev[u]=; return u;}
void pu(int u) {siz[u]=siz[ch[u][]]+siz[ch[u][]]+;}
void pd(int u) {if(rev[u])rev[u]=,swap(ch[u][],ch[u][]),rev[ch[u][]]^=,rev[ch[u][]]^=;}
void rot(int& u,int f) {
int v=ch[u][f];
ch[u][f]=ch[v][f^],ch[v][f^]=u;
pu(u),pu(v),u=v;
}
void splay(int& u,int k) {
pd(u);
if(siz[ch[u][]]+!=k) {
int f=k>siz[ch[u][]]+;
if(f)k-=siz[ch[u][]]+;
int& v=ch[u][f];
pd(v);
if(siz[ch[v][]]+!=k) {
int ff=k>siz[ch[v][]]+;
if(ff)k-=siz[ch[v][]]+;
splay(ch[v][ff],k),f==ff?rot(u,f):rot(v,ff);
}
rot(u,f);
}
}
void sp(int& u,int k,int& v) {splay(u,k),v=ch[u][],ch[u][]=,pu(u);}
void mg(int& u,int v) {splay(u,siz[u]),ch[u][]=v,pu(u);}
void rv(int& u,int l,int r) {
int lv,rv;
sp(u,r,rv),sp(u,l-,lv);
rev[lv]^=;
mg(u,lv),mg(u,rv);
}
#define mid ((l+r)>>1)
void build(int& u,int l=,int r=n) {
if(l>r) {u=; return;}
u=newnode(a[mid]);
build(ch[u][],l,mid-),build(ch[u][],mid+,r),pu(u);
}
int f;
void dfs(int u) {
if(!u)return;
pd(u);
dfs(ch[u][]);
if(val[u]!=) {
f?f=:printf(" ");
printf("%d",val[u]);
}
dfs(ch[u][]);
}
int main() {
scanf("%d%d",&n,&m);
for(int i=; i<=n; ++i)a[i]=i;
a[]=,build(rt);
while(m--) {
int l,r;
scanf("%d%d",&l,&r);
rv(rt,l+,r+);
}
f=,dfs(rt);
return ;
}
无旋treap(FHQ-treap):
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e5+,inf=0x3f3f3f3f;
int ch[N][],val[N],siz[N],rd[N],rev[N],tot,n,m,a[N],rt;
#define l(u) ch[u][0]
#define r(u) ch[u][1]
int newnode(int x) {int u=++tot; val[u]=x,siz[u]=,rd[u]=rand(),l(u)=r(u)=rev[u]=; return u;}
void flip(int u) {rev[u]^=,swap(l(u),r(u));}
void pu(int u) {siz[u]=siz[l(u)]+siz[r(u)]+;}
void pd(int u) {if(rev[u])rev[u]=,flip(l(u)),flip(r(u));}
void sp(int& u,int k,int& v) {
if(!u) {v=; return;}
pd(u);
if(k>=siz[l(u)]+)sp(r(u),k-(siz[l(u)]+),v),pu(u);
else v=u,u=l(u),sp(u,k,l(v)),pu(v);
}
void mg(int& u,int v) {
if(!u||!v) {u=u|v; return;}
if(rd[u]>rd[v])pd(u),mg(r(u),v);
else pd(v),mg(u,l(v)),l(v)=u,u=v;
pu(u);
}
void rv(int& u,int l,int r) {
int lv,rv;
sp(u,r,rv),sp(u,l-,lv);
flip(lv);
mg(u,lv),mg(u,rv);
}
int f;
void dfs(int u) {
if(!u)return;
pd(u);
dfs(l(u));
if(val[u]!=) {
f?f=:printf(" ");
printf("%d",val[u]);
}
dfs(r(u));
}
int main() {
srand(time());
scanf("%d%d",&n,&m);
rt=newnode();
for(int i=; i<=n; ++i)mg(rt,newnode(i));
while(m--) {
int l,r;
scanf("%d%d",&l,&r);
rv(rt,l+,r+);
}
f=,dfs(rt);
return ;
}
BZOJ - 3223 Tyvj 1729 文艺平衡树 (splay/无旋treap)的更多相关文章
- BZOJ 3223: Tyvj 1729 文艺平衡树(splay)
速度居然进前十了...第八... splay, 区间翻转,用一个类似线段树的lazy标记表示是否翻转 ------------------------------------------------- ...
- bzoj 3223: Tyvj 1729 文艺平衡树 (splay)
链接: https://www.lydsy.com/JudgeOnline/problem.php?id=3223 题面: 3223: Tyvj 1729 文艺平衡树 Time Limit: 10 S ...
- BZOJ 3223: Tyvj 1729 文艺平衡树-Splay树(区间翻转)模板题
3223: Tyvj 1729 文艺平衡树 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 6881 Solved: 4213[Submit][Sta ...
- bzoj 3223/tyvj 1729 文艺平衡树 splay tree
原题链接:http://www.tyvj.cn/p/1729 这道题以前用c语言写的splay tree水过了.. 现在接触了c++重写一遍... 只涉及区间翻转,由于没有删除操作故不带垃圾回收,具体 ...
- BZOJ 3223 Tyvj 1729 文艺平衡树 | Splay 维护序列关系
题解: 每次reverse(l,r) 把l-1转到根,r+1变成他的右儿子,给r+1的左儿子打个标记就是一次反转操作了 每次find和dfs输出的时候下放标记,把左儿子和右儿子换一下 记得建树的时候建 ...
- BZOJ 3223: Tyvj 1729 文艺平衡树
3223: Tyvj 1729 文艺平衡树 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 3628 Solved: 2052[Submit][Sta ...
- [Bzoj3223][Tyvj1729] 文艺平衡树(splay/无旋Treap)
题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=3223 平衡树处理区间问题的入门题目,普通平衡树那道题在维护平衡树上是以每个数的值作为维护 ...
- fhq_treap || BZOJ 3223: Tyvj 1729 文艺平衡树 || Luogu P3391 【模板】文艺平衡树(Splay)
题面: [模板]文艺平衡树(Splay) 题解:无 代码: #include<cstdio> #include<cstring> #include<iostream> ...
- [BZOJ 3223 & Tyvj 1729]文艺平衡树 & [CodeVS 3243]区间翻转
题目不说了,就是区间翻转 传送门:BZOJ 3223 和 CodeVS 3243 第一道题中是1~n的区间翻转,而第二道题对于每个1~n还有一个附加值 实际上两道题的思路是一样的,第二题把值对应到位置 ...
随机推荐
- Python学习札记(六) Basic3 List和Tuple
参考:List Tuple Note List List是Python中一个很吊的数据结构,类似C语言的数组. 1.定义:listname = [variable 1, v2, v3, ..., vn ...
- CDN专业一站式解决方案
调度,弱网加速,动态防御,无限节点(重)新技术
- java的时间获取
System类代表系统,系统级的很多属性和控制方法都放置在该类的内部.该类位于java.lang包. currentTimeMillis方法 public static long currentTim ...
- .Net遍历窗体上控件
实现遍历窗体上的控件以及找出TextBox控件,代码如下: foreach( Control control in this.Controls ) { if( control is TextBox ) ...
- centos cgroup配置
centOS 6:1. 启用cgroup 查看内核是否支持cgroup功能:cat /boot/config-`uname -r` | grep -i rt_group 查看支持的子系统: ...
- 1-15-1 RAID磁盘阵列的原理和搭建
大纲: 1.1-1-企业级RAID磁盘阵列 RAID磁盘阵列的原理 RAID0,1,5,10的搭建 硬件RAID卡 1.2-1-使用廉价的磁盘搭建RAID磁盘阵列 实战-配置RAID0带区卷 ==== ...
- 利用PXE引导安装centos7
# 利用PXE引导安装centos7 # ###简介### > PXE (Pre-boot Execution Environment,PXE client 在网卡的 ROM 中,当计算机引导时 ...
- 【BZOJ】3389: [Usaco2004 Dec]Cleaning Shifts安排值班(贪心)
http://www.lydsy.com/JudgeOnline/problem.php?id=3389 显然左端点排序后,依次取. 要考虑下一次取的方案: 待选点为a[j].x<=a[now] ...
- CF910C
题解: 首先考虑暴力不行 然后采用贪心 按位展开 然后注意不能有前缀0 代码: #include<bits/stdc++.h> using namespace std; ],ans; ], ...
- gitblit-禁用用户
使用管理员账号(此处演示使用admin)登录到系统 右上角,找到用户菜单 再用户列表,找到要进行权限管理的用户,(演示alex) 禁用用户,取消权限 验证已经禁用 pull 权限被禁止