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还有一个附加值 实际上两道题的思路是一样的,第二题把值对应到位置 ...
随机推荐
- 【链接】Eclipse的Debug调试技巧
Eclipse的Debug调试技巧大全 https://mp.weixin.qq.com/s/bORg9YxJiby2WenYRrXY-w 使用Eclipse调试Java程序的10个技巧 https: ...
- Jenkins Pipeline shell脚本用svn_revision当做系统版本号
1. 使用dir命令,进入发布目录,版本号所在文件夹. 2. 使用sed命令 修改替换版本号,这里使用vvvv作为要替换的版本号. 3. 最后一步可以不加.只是方便查看效果. stage(" ...
- class文件直接修改_反编译修改class文件变量
今天笔者同事遇到一个问题,客户同事的数据库连接信息直接写在代码中,连接的密码改了,但是又没有源代码,所以只能直接修改Java class文件. 记录一下修改步骤: 1.下载JClassLib_wind ...
- KVM irqfd and ioeventfd
In previous article vhost architecture we mentioned that vhost and the guest signal each other by ir ...
- es6之Iterator
1.任何数据结构只要部署了Iterator接口(本质是一个指针对象),也就是部署了Symbol.iterator属性,便可以完成遍历操作:数组原生就具备Iterator接口,就可以用for...of遍 ...
- POJ1247-Magnificent Meatballs
http://poj.org/problem?id=1247 Magnificent Meatballs Time Limit: 1000MS Memory Limit: 10000K Total ...
- centos 7网速监控脚本
#!/bin/bashif [ $# -ne 1 ];thendev="eth0"elsedev=$1fi while :doRX1=`/sbin/ifconfig $dev |a ...
- Ngix
Ngix安装 官网地址,下载为源码,需要编译安装 http://nginx.org/ 环境 1.需要安装gcc的环境. yum install gcc-c++ 2.第三方的开发包. PCRE PCRE ...
- (3) iOS开发之UI处理-UIView篇
在UIView作为许多子控件的容器的时候,首先我们需要动态的计算出UIView下的所有子控件的高度,并布局排列好,然后我们还要把作为容器的UIView的高度调整到刚好包裹着所有子控件,不会过矮,也不会 ...
- Ansible 小手册系列 三(命令介绍)
仅仅只是介绍,可以选择跳过 ansible ansible是指令核心部分,其主要用于执行ad-hoc命令,即单条命令.默认后面需要跟主机和选项部分,默认不指定模块时,使用的是command模块. Us ...