文艺平衡树

思路:

  splay翻转操作模板;

  虚拟最左最右端点,然后每次都把l翻转到root,r+2翻转到root的右节点;

  然后在r+2的左节点上打标记;

  标记需要在旋转,rank,print时下放;

  建树需要用完全平衡二叉树;

来,上代码:

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm> using namespace std; #define maxn 100005 struct TreeNodeType {
int key,opi,size,ch[],flag;
};
struct TreeNodeType tree[maxn]; int n,m,root,ans[maxn],tot; inline void in(int &now)
{
register char Cget=getchar();now=;
while(Cget>''||Cget<'') Cget=getchar();
while(Cget>=''&&Cget<='')
{
now=now*+Cget-'';
Cget=getchar();
}
} inline void updata(int now)
{
tree[now].size=;
if(tree[now].ch[]) tree[now].size+=tree[tree[now].ch[]].size;
if(tree[now].ch[]) tree[now].size+=tree[tree[now].ch[]].size;
} inline void down(int now)
{
tree[now].flag=;
swap(tree[now].ch[],tree[now].ch[]);
if(tree[now].ch[]) tree[tree[now].ch[]].flag^=;
if(tree[now].ch[]) tree[tree[now].ch[]].flag^=;
} inline int getson(int now)
{
return tree[tree[now].opi].ch[]==now;
} void rotate(int now)
{
int opi=tree[now].opi,fopi=tree[opi].opi,pos=getson(now);
if(tree[opi].flag&&opi) down(opi);
if(tree[now].flag&&now) down(now);
tree[opi].ch[pos]=tree[now].ch[!pos];
tree[tree[now].ch[!pos]].opi=opi;
tree[now].ch[!pos]=opi;
tree[opi].opi=now;
tree[now].opi=fopi;
if(fopi) tree[fopi].ch[tree[fopi].ch[]==opi]=now;
updata(opi),updata(now);
} inline void splay(int now,int to)
{
for(int opi;(opi=tree[now].opi)!=to;rotate(now))
{
if(tree[opi].opi!=to) rotate(getson(now)==getson(opi)?opi:now);
}
if(!to) root=now;
} int rank_(int x)
{
int now=root;
while()
{
if(tree[now].flag) down(now);
if(tree[tree[now].ch[]].size>=x) now=tree[now].ch[];
else
{
x-=tree[tree[now].ch[]].size+;
if(!x) return now;
now=tree[now].ch[];
}
}
} void print(int now)
{
if(tree[now].flag) down(now);
if(tree[now].ch[]) print(tree[now].ch[]);
ans[++tot]=tree[now].key;
if(tree[now].ch[]) print(tree[now].ch[]);
} int build(int l,int r,int opi)
{
int now=(l+r)>>;
tree[now].opi=opi;
tree[now].key=ans[now];
if(now>l) tree[now].ch[]=build(l,now-,now);
if(now<r) tree[now].ch[]=build(now+,r,now);
updata(now);return now;
} int main()
{
in(n),in(m),root=;
for(int i=;i<=n+;i++) ans[i]=i-;
root=build(,n+,);
int l,r;
while(m--)
{
in(l),in(r);
l,r+=;
int x=rank_(l),y=rank_(r);
splay(x,);
splay(y,x);
tree[tree[tree[root].ch[]].ch[]].flag^=;
}
print(root);
for(int i=;i<=n;i++) printf("%d ",ans[i+]);
return ;
}

AC日记——文艺平衡树 洛谷 P3391的更多相关文章

  1. AC日记——寻找道路 洛谷 P2296

    题目描述 在有向图G 中,每条边的长度均为1 ,现给定起点和终点,请你在图中找一条从起点到终点的路径,该路径满足以下条件: 1 .路径上的所有点的出边所指向的点都直接或间接与终点连通. 2 .在满足条 ...

  2. AC日记——铺地毯 洛谷 P1003(水水水水水~)

    题目描述 为了准备一个独特的颁奖典礼,组织者在会场的一片矩形区域(可看做是平面直角坐标系的第一象限)铺上一些矩形地毯.一共有 n 张地毯,编号从 1 到n .现在将这些地毯按照编号从小到大的顺序平行于 ...

  3. AC日记——过河卒 洛谷 1002

    题目描述 棋盘上A点有一个过河卒,需要走到目标B点.卒行走的规则:可以向下.或者向右.同时在棋盘上C点有一个对方的马,该马所在的点和所有跳跃一步可达的点称为对方马的控制点.因此称之为“马拦过河卒”. ...

  4. AC日记——[SDOI2017]相关分析 洛谷 P3707

    [SDOI2017]相关分析 思路: 裸线段树: (玄学ac): 代码: #include <bits/stdc++.h> using namespace std; #define max ...

  5. AC日记——丢瓶盖 洛谷 P1316

    题目描述 陶陶是个贪玩的孩子,他在地上丢了A个瓶盖,为了简化问题,我们可以当作这A个瓶盖丢在一条直线上,现在他想从这些瓶盖里找出B个,使得距离最近的2个距离最大,他想知道,最大可以到多少呢? 输入输出 ...

  6. AC日记——滑动窗口 洛谷 P1886

    题目描述 现在有一堆数字共N个数字(N<=10^6),以及一个大小为k的窗口.现在这个从左边开始向右滑动,每次滑动一个单位,求出每次滑动后窗口中的最大值和最小值. 例如: The array i ...

  7. AC日记——挤牛奶 洛谷 P1204

    题目描述 三个农民每天清晨5点起床,然后去牛棚给3头牛挤奶.第一个农民在300秒(从5点开始计时)给他的牛挤奶,一直到1000秒.第二个农民在700秒开始,在 1200秒结束.第三个农民在1500秒开 ...

  8. AC日记——导弹拦截 洛谷 P1020 (dp+模拟)

    题目描述 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度.某天,雷达捕捉到敌国的导弹 ...

  9. AC日记——信息传递 洛谷 P2661 (tarjan求环)

    题目描述 有n个同学(编号为1到n)正在玩一个信息传递的游戏.在游戏里每人都有一个固定的信息传递对象,其中,编号为i的同学的信息传递对象是编号为Ti同学. 游戏开始时,每人都只知道自己的生日.之后每一 ...

随机推荐

  1. Xadmin后台管理系统搭建基于Django1.11.11+Python3.6

    安装python及Django百度即可 主要介绍Xadmin安装 访问地址:https://github.com/sshwsfc/xadmin  下载 安装好之后,将xamdin目录复制到项目 我放在 ...

  2. [转载]C#中使用ADO.NET连接SQL Server数据库,自动增长字段用作主键,处理事务时的基本方法

    问题描述: 假设在数据库中存在以下两张数据表: User表,存放用户的基本信息,基本结构如下所示:   类型 说明 ID_User int 自动增长字段,用作该表的主键 UserName varcha ...

  3. NGUI 学习总结

    NGUI 学习一段时间了,这里总结一下,用于以后查看. 获取组件 在Awake函数里获取组件,然后就可在Start以及其他函数里使用 lbl = GetComponent<UILabel> ...

  4. Java开发微信公众号(四)---微信服务器post消息体的接收及消息的处理

    在前几节文章中我们讲述了微信公众号环境的搭建.如何接入微信公众平台.以及微信服务器请求消息,响应消息,事件消息以及工具处理类的封装:接下来我们重点说一下-微信服务器post消息体的接收及消息的处理,这 ...

  5. sqlserver操作各种文件方法

    ******* 导出到excelEXEC master..xp_cmdshell ''bcp SettleDB.dbo.shanghu out c:\temp1.xls -c -q -S"G ...

  6. 基于 <tx> 和 <aop> 命名空间的声明式事务管理

    环境配置 项目使用SSH架构,现在要添加Spring事务管理功能,针对当前环境,只需要添加Spring 2.0 AOP类库即可.添加方法: 点击项目右键->Build Path->Add ...

  7. 用Excel的分列功能格式化时间

    从数据库导出的时间是带有毫秒的,怎么变成短的时间呢? 首先在时间列后面插入一列: 第二,点击数据菜单,点击分列,下一步,然后输入分割符号,然后就变成了两列.

  8. nyoj 题目7 街区最短路径问题

    街区最短路径问题 时间限制:3000 ms  |  内存限制:65535 KB 难度:4   描述 一个街区有很多住户,街区的街道只能为东西.南北两种方向. 住户只可以沿着街道行走. 各个街道之间的间 ...

  9. selenium webdriver——鼠标事件

    Web产品中提供了丰富的鼠标交互方式,例如鼠标右击.双击.悬停.甚至是鼠标拖动等功能,在WebDriver中,将这些关于鼠标操作的方法 封装在ActionChains类中: ActionChains类 ...

  10. 洛谷P3245 [HNOI2016]大数 【莫队】

    题目 题解 除了\(5\)和\(2\) 后缀数字对\(P\)取模意义下,两个位置相减如果为\(0\),那么对应子串即为\(P\)的倍数 只用对区间种相同数个数\(x\)贡献\({x \choose 2 ...