bzoj 3223 splay模板题3
水题。。。貌似理解splay怎么维护数列了。。。
每个点维护一个size,它的位置就是它的size,区间翻转的话可以打标记,find的时候push_down,交换左右子树。
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#define N 100005
#define lc(x) ch[x][0]
#define rc(x) ch[x][1]
using namespace std;
int cnt;
int k[N];
int size[N];
int lazy[N];
int ch[N][];
int dai[N];int fa[N];
int n,m;int root;
void push_up(int x)
{
size[x]=size[ch[x][]]+size[ch[x][]]+;
return ;
}
void rotate(int p)
{
int q=fa[p],y=fa[q],x=(ch[q][]==p);
ch[q][x]=ch[p][x^];fa[ch[p][x^]]=q;
ch[p][x^]=q;fa[q]=p;fa[p]=y;
if(y)
{
if(q==ch[y][])ch[y][]=p;else ch[y][]=p;
}
push_up(q);push_up(p);
return ;
}
void splay(int x,int pos)
{
for(int y;y=fa[x];rotate(x))
{
if(y==pos)break;
if(fa[y]!=pos)
{
if((ch[fa[y]][]==y&&ch[y][]==x)||(ch[fa[y]][]==y&&ch[y][]==x))rotate(y);
else rotate(x);
}
}
if(!pos)root=x;
}
void push_down(int x)
{
if(lazy[x])
{
lazy[x]=;
lazy[ch[x][]]^=;lazy[ch[x][]]^=;
swap(ch[x][],ch[x][]);
}
}
int find(int k,int rank)
{
push_down(k);
int l=ch[k][];int r=ch[k][];
if(size[l]+==rank)return k;
else if(size[l]>=rank)return find(ch[k][],rank);
else return find(ch[k][],rank-size[l]-);
}
void dfs(int x)
{
push_down(x);
if(ch[x][])dfs(ch[x][]);
if(k[x]!=&&k[x]!=n+)printf("%d ",k[x]);
if(ch[x][])dfs(ch[x][]);
}
int main()
{
scanf("%d%d",&n,&m);
cnt=n+;root=;
for(int i=;i<=n+;i++)
{
ch[i+][]=i+;
fa[i+]=i+;
k[i+]=i;
size[i+]=n+2-i;
}ch[n+][]=;
for(int i=;i<=m;i++)
{
int t1,t2;
scanf("%d%d",&t1,&t2);
int x1=find(root,t1);int x2=find(root,t2+);
splay(x1,);splay(x2,x1);
lazy[ch[x2][]]^=;
}
dfs(root);
return ;
}
/*
5 1
1 4
*/
bzoj 3223 splay模板题3的更多相关文章
- bzoj 1588 splay模板题
用晚自习学了一下splay模板,没想象中那么难,主要是左旋和右旋可以简化到一个函数里边,减少代码长度... #include<iostream> #include<cstdio> ...
- bzoj 3224 splay模板题4
再刷水题我就废了... #include<iostream> #include<cstdio> #include<algorithm> #include<cs ...
- bzoj 1208 splay模板题2
自己yy了找前驱和后继,学了学怎么删除...(反正就是练模板) #include<iostream> #include<cstdio> #include<cstring& ...
- 【BZOJ 3196】二逼平衡树 线段树套splay 模板题
我写的是线段树套splay,网上很多人写的都是套treap,然而本蒟蒻并不会treap 奉上sth神犇的模板: //bzoj3196 二逼平衡树,支持修改某个点的值,查询区间第k小值,查询区间某个值排 ...
- 【BZOJ 3188】【Coci 2011】Upit Splay模板题
转啊转终于转出来了,然而我的模板跟陈竞潇学长的模板一模一样,还是太弱啊,第一次用指针. #include<cstdio> #include<cstring> #include& ...
- BZOJ 1208 [HNOI2004]宠物收养所 | SPlay模板题
题目: 洛谷也能评 题解: 记录一下当前树维护是宠物还是人,用Splay维护插入和删除. 对于任何一次询问操作都求一下value的前驱和后继(这里前驱和后继是可以和value相等的),比较哪个差值绝对 ...
- BZOJ 3223 Splay区间翻转
思路: 区间翻转的裸题 终于tm理解splay了-- //By SiriusRen #include <cstdio> #include <cstring> #include ...
- BZOJ 1588 平衡树 模板题
Treap: //By SiriusRen #include <cstdio> #include <algorithm> using namespace std; int si ...
- BZOJ 3224 平衡树模板题
Treap: //By SiriusRen #include <cstdio> #include <algorithm> using namespace std; int n, ...
随机推荐
- zlog学习笔记(mdc)
mdc.h #ifndef __zlog_mdc_h #define __zlog_mdc_h #include "zc_defs.h" typedef struct zlog_m ...
- Debian 8.2 下安装MySQL5.7.9 Generic Binaries
安装过程参考了Installing MySQL on Unix/Linux Using Generic Binaries 首先检查是否安装libaio shell> apt-cache sear ...
- netcore web.config ConnectionStrings AppSettings
new ConfigurationBuilder().Build().GetSection("ConnectionStrings") new ConfigurationBuilde ...
- 资源搜集:Git精品文章推荐,常年更新
以下放置的是搜集到的Git精品文章,常年更新: Git 常用命令详解(二) Git版本控制软件结合GitHub从入门到精通常用命令学习手册 Pro Git(中文版)
- github上传
创建全局的name和email 1.创建ssh(使用命令)$ssh-keygen -t rsa -C xxxxx@gmail.com(注册github时的email)2.在github中添加ssh 登 ...
- APP架子迁移指南(一)
搭架子是脑垂体在放烟花 俗话说吃多少饭,走多少路,上学的时候捧着<设计模式>就想睡觉,现在轮子看得多了,自然有心领神会之感.搭架子就像谈哲学,如高山流水,遇弯则急.遇潭则深.我印象最深的是 ...
- 深入理解计算机系统(2.7)---二进制浮点数,IEEE标准(重要)
2.6我们进行了二进制整数运算的最后一役,本次LZ将和各位一起进入浮点数的世界,这里没有无符号,没有补码,但是有各种各样的惊奇.倘若你真正的进入了浮点数的世界,一定会发现它原来是这么有意思,而不是像之 ...
- [ZOJ2760]How Many Shortest Path(floyd+最大流)
题目:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1760 题意:给你一个一个n*n(n<=100)的有向图,问你从s到 ...
- JavaScript学习笔记- 自定义滚动条插件
此滚动条仅支持竖向(Y轴) 一.Css /*这里是让用户鼠标在里面不能选中文字,避免拖动的时候出错*/ body { -moz-user-select: none; /*火狐*/ -webkit-us ...
- grub.conf文件参数详解
Grub是Linux的下系统启动器之一(另一个名为Lilo),grub.conf相当于 windows下的boot.ini,都是存放启动项设置和信息的,如果你熟悉boot.ini的设置的话相信也可以很 ...