【BZOJ3223】【luoguP3391】文艺平衡树
description
您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:翻转一个区间,例如原有序序列是5 4 3 2 1,翻转区间是[2,4]的话,结果是5 2 3 4 1
analysis
我他妈终于会$splay$翻转板子了
注意翻转标记不用整条链下传,只需查找时交换儿子节点
注意下标和存储值是不一样的
code
#pragma GCC optimize("O3")
#pragma G++ optimize("O3")
#include<stdio.h>
#include<string.h>
#include<algorithm>
#define MAXN 100005
#define INF 1000000007
#define ll long long
#define reg register ll
#define fo(i,a,b) for (reg i=a;i<=b;++i)
#define fd(i,a,b) for (reg i=a;i>=b;--i)
using namespace std;
ll tr[MAXN][2];
ll fa[MAXN],size[MAXN],val[MAXN],rev[MAXN];
ll n,m,tot,root;
inline ll read()
{
ll x=0,f=1;char ch=getchar();
while (ch<'0' || '9'<ch){if (ch=='-')f=-1;ch=getchar();}
while ('0'<=ch && ch<='9')x=x*10+ch-'0',ch=getchar();
return x*f;
}
inline void newnode(ll &x,ll y,ll z)
{
x=++tot,tr[x][0]=tr[x][1]=0,fa[x]=z,size[x]=1,val[x]=y;
}
inline void update(ll x)
{
size[x]=size[tr[x][0]]+size[tr[x][1]]+1;
}
inline void build(ll &x,ll l,ll r,ll y)
{
if (l>r)return;
ll mid=(l+r)>>1;newnode(x,mid,y);
build(tr[x][0],l,mid-1,x),build(tr[x][1],mid+1,r,x);
update(x);
}
inline ll lr(ll x)
{
return tr[fa[x]][1]==x;
}
inline void rotate(ll x)
{
ll y=fa[x],k=lr(x);
tr[y][k]=tr[x][!k];
if (tr[x][!k])fa[tr[x][!k]]=y;
fa[x]=fa[y];
if (fa[y])tr[fa[y]][lr(y)]=x;
tr[x][!k]=y,fa[y]=x;
update(y),update(x);
}
inline void splay(ll x,ll y)
{
while (fa[x]!=y)
{
if (fa[fa[x]]!=y)
{
if (lr(fa[x])==lr(x))rotate(fa[x]);
else rotate(x);
}
rotate(x);
}
if (y==0)root=x;
}
inline void down(ll x)
{
if (rev[x])
{
swap(tr[x][0],tr[x][1]);
rev[tr[x][0]]^=1,rev[tr[x][1]]^=1,rev[x]=0;
}
}
inline ll find(ll x,ll y)
{
down(x);
if (y==size[tr[x][0]]+1)return x;
if (y<=size[tr[x][0]])return find(tr[x][0],y);
else return find(tr[x][1],y-size[tr[x][0]]-1);
}
inline void modify(ll x,ll y)
{
ll l=find(root,x),r=find(root,y+2);
splay(l,0),splay(r,root);
rev[tr[r][0]]^=1;
}
int main()
{
freopen("P3391.in","r",stdin);
n=read(),m=read();
newnode(root,INF,0),newnode(tr[root][1],INF,root);
build(tr[tr[root][1]][0],1,n,tr[root][1]);
while (m--)
{
ll x=read(),y=read();
modify(x,y);
}
fo(i,2,n+1)printf("%lld ",val[find(root,i)]);
return 0;
}
【BZOJ3223】【luoguP3391】文艺平衡树的更多相关文章
- BZOJ3223:文艺平衡树——超详细题解
http://www.lydsy.com/JudgeOnline/problem.php?id=3223 题面复制于洛谷. 题目背景 这是一道经典的Splay模板题——文艺平衡树. 题目描述 您需要写 ...
- 【BZOJ3223】文艺平衡树(Splay)
题面 题目描述 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:翻转一个区间,例如原有序序列是5 4 3 2 1,翻转区间是[2,4]的话,结果是5 2 3 4 1 ...
- [BZOJ3223] [Tyvj1729] 文艺平衡树 (splay)
Description 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:翻转一个区间,例如原有序序列是5 4 3 2 1,翻转区间是[2,4]的话,结果是5 2 3 ...
- [Bzoj3223][Tyvj1729] 文艺平衡树(splay/无旋Treap)
题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=3223 平衡树处理区间问题的入门题目,普通平衡树那道题在维护平衡树上是以每个数的值作为维护 ...
- 【bzoj3223】文艺平衡树
#include<bits/stdc++.h> #define N 300005 #define rat 4 using namespace std; struct Node{ int s ...
- [BZOJ3223/Tyvj1729]文艺平衡树
Description 您需要写一种数据结构(可参考题目标题),来维护一个有序数列 其中需要提供以下操作: 翻转一个区间,例如原有序序列是5 4 3 2 1,翻转区间是[2,4]的话,结果是5 2 3 ...
- [BZOJ3223]Tyvj 1729 文艺平衡树
[BZOJ3223]Tyvj 1729 文艺平衡树 试题描述 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:翻转一个区间,例如原有序序列是5 4 3 2 1,翻转区 ...
- luoguP3391[模板]文艺平衡树(Splay) 题解
链接一下题目:luoguP3391[模板]文艺平衡树(Splay) 平衡树解析 这里的Splay维护的显然不再是权值排序 现在按照的是序列中的编号排序(不过在这道题目里面就是权值诶...) 那么,继续 ...
- BZOJ3223: Tyvj 1729 文艺平衡树 [splay]
3223: Tyvj 1729 文艺平衡树 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 3595 Solved: 2029[Submit][Sta ...
- bzoj3223 文艺平衡树 (treap or splay分裂+合并)
3223: Tyvj 1729 文艺平衡树 Time Limit: 10 Sec Memory Limit: 128 MB Submit: 3313 Solved: 1883 [Submit][S ...
随机推荐
- CSS3:CSS3 圆角
ylbtech-CSS3:CSS3 圆角 1.返回顶部 1. CSS3 圆角 CSS3 圆角 使用 CSS3 border-radius 属性,你可以给任何元素制作 "圆角". C ...
- LeetCode 704. Binary Search (二分查找)
题目标签:Binary Search 很标准的一个二分查找,具体看code. Java Solution: Runtime: 0 ms, faster than 100 % Memory Usage ...
- Openstack Nova 源码分析 — 使用 VCDriver 创建 VMware Instance
目录 目录 前言 流程图 nova-compute vCenter 前言 在上一篇Openstack Nova 源码分析 - Create instances (nova-conductor阶段)中, ...
- HSF简单实现记录(基于 Pandora Boot 开发)
文章目录 声明 注意 安装轻量配置中心 启动轻量配置中心 配置 hosts 结果验证 开发工具准备 在 Maven 中配置 EDAS 的私服地址 验证配置是否成功 开发 demo下载 服务注册与发现 ...
- Hadoop节点集群挂了,Hbase数据源损坏怎么办
今天集群节点一下子挂了5台,hbase的数据块也损坏. hadoop日志 .0.15:36642 dest: /ip:50010 2014-08-26 15:01:14,918 WARN org.ap ...
- git ssh使用公钥授权怎么都不通过
前提: 1.客户端生成了id_rsa.pub和id_rsa 2.服务端在.ssh/authorized_keys也加入了客户端的id_res.pub 3./etc/ssh/sshd_config开启了 ...
- jupyter安装_pip法
安装jupyter notebook的流程(注意python至少需要3.6版本) python -m pip install jupyter #安装jupyter python -m pip ins ...
- Activiti学习笔记1 — 下载与开发环境的配置
一.下载 JDK下载URL: Tomcat下载URL:http://tomcat.apache.org/ Eclipse下载URL:http://www.oracle.com/technetwork/ ...
- 9_山寨系统调用 SystemCallEntry
思想: 再次在 GDT 中偷内存 搭建 系统调用需要的 逻辑框架与功能实现: 基本分解妄想: 构建系统调用的代码: 拷贝到 偷取的内存中: idt 向量 序号21位置: 8003ee00`0008f1 ...
- SVN 分支操作
一 拉取分支 1 选择浏览 2 输入svn项目路径:https://IP/svn/ 3 选择拉取的项目 4 下载到本地路劲 右键选中的分支—CheckOut 选择本地路劲 二 分支合并 1 分支合并 ...