bzo j4825 [Hnoi2017]单旋
Description

Input
Output
#include<cstdio>
#include<set>
const int N=1e5+;
namespace lct{
#define lc ch][0
#define rc ch][1
#define fa ch][2
#define sz ch][3
int ch[N][];
bool nrt(int x){
return x==x[fa][lc]||x==x[fa][rc];
}
void up(int x){
x[sz]=+x[lc][sz]+x[rc][sz];
}
void rot(int x){
int f=x[fa],g=f[fa],d=x==f[rc];
if(nrt(f))g[ch][g[rc]==f]=x;
x[fa]=g;
(f[ch][d]=x[ch][d^])[fa]=f;
(x[ch][d^]=f)[fa]=x;
up(f);up(x);
}
void sp(int x){
while(nrt(x)){
int f=x[fa];
if(nrt(f))rot((x==f[lc])==(f==f[fa][lc])?f:x);
rot(x);
}
}
void acs(int x){
for(int y=;x;sp(x),x[rc]=y,up(x),y=x,x=x[fa]);
}
void ct(int x){
acs(x);sp(x);
x[lc][fa]=;
x[lc]=;
up(x);
}
void lk(int x,int y){
sp(x);
x[fa]=y;
}
void query(int x){
acs(x);
sp(x);
printf("%d\n",x[lc][sz]+);
}
#undef lc
#undef rc
#undef fa
#undef sz
}
#define G *++ptr
char buf[N*],*ptr=buf-;
int q,o,x,rt=,ch[N][],fa[N],p=;
int _(){
int x=,c=G;
while(c<)c=G;
while(c>)x=x*+c-,c=G;
return x;
}
struct pos{
int x,y;
bool operator<(pos w)const{return x<w.x;}
};
std::set<pos>st;
void setc(int w,int d,int u){
fa[ch[w][d]=u]=w;
lct::lk(u,w);
}
void setc(int w,int d){
int u=ch[w][d];
fa[u]=ch[w][d]=;
lct::ct(u);
}
void ins(int x){
int u=++p;
lct::ch[u][]=;
if(!rt){
rt=u;
}else{
std::set<pos>::iterator it=st.upper_bound((pos){x,});
if(it==st.end()||ch[it->y][]){
--it;
setc(it->y,,u);
}else{
setc(it->y,,u);
}
}
lct::query(u);
st.insert((pos){x,u});
}
int main(){
fread(buf,,sizeof(buf),stdin)[buf]=;
for(q=_();q;--q){
o=_();
if(o==){
x=_();
ins(x);
}else if(o==||o==){
int w=st.begin()->y,c=ch[w][],f=fa[w];
lct::query(w);
if(f){
setc(f,);
if(c)setc(w,),setc(f,,c);
if(o==)setc(w,,rt),rt=w;
}else if(o==){
if(c)setc(w,),rt=c;
}
if(o==)st.erase(st.begin());
}else if(o==||o==){
int w=(--st.end())->y,c=ch[w][],f=fa[w];
lct::query(w);
if(f){
setc(f,);
if(c)setc(w,),setc(f,,c);
if(o==)setc(w,,rt),rt=w;
}else if(o==){
if(c)setc(w,),rt=c;
}
if(o==)st.erase(--st.end());
}
if(st.empty())rt=;
}
return ;
}
bzo j4825 [Hnoi2017]单旋的更多相关文章
- bzoj 4825: [Hnoi2017]单旋 [lct]
4825: [Hnoi2017]单旋 题意:有趣的spaly hnoi2017刚出来我就去做,当时这题作死用了ett,调了5节课没做出来然后发现好像直接用lct就行了然后弃掉了... md用lct不知 ...
- 【LG3721】[HNOI2017]单旋
[LG3721][HNOI2017]单旋 题面 洛谷 题解 20pts 直接模拟\(spaly\)的过程即可. 100pts 可以发现单旋最大.最小值到根,手玩是有显然规律的,发现只需要几次\(lin ...
- 4825: [Hnoi2017]单旋
4825: [Hnoi2017]单旋 链接 分析: 以后采取更保险的方式写代码!!!81行本来以为不特判也可以,然后就总是比答案大1,甚至出现负数,调啊调啊调啊调~~~ 只会旋转最大值和最小值,以最小 ...
- [BZOJ4825][HNOI2017]单旋(线段树+Splay)
4825: [Hnoi2017]单旋 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 667 Solved: 342[Submit][Status][ ...
- 【BZOJ4825】[Hnoi2017]单旋 线段树+set
[BZOJ4825][Hnoi2017]单旋 Description H 国是一个热爱写代码的国家,那里的人们很小去学校学习写各种各样的数据结构.伸展树(splay)是一种数据结构,因为代码好写,功能 ...
- bzoj4825 [Hnoi2017]单旋
Description H 国是一个热爱写代码的国家,那里的人们很小去学校学习写各种各样的数据结构.伸展树(splay)是一种数据结构,因为代码好写,功能多,效率高,掌握这种数据结构成为了 H 国的必 ...
- BZOJ:4825: [Hnoi2017]单旋
Description H 国是一个热爱写代码的国家,那里的人们很小去学校学习写各种各样的数据结构.伸展树(splay)是一种数据结构,因为代码好写,功能多,效率高,掌握这种数据结构成为了 H 国的必 ...
- HNOI2017 单旋
题目描述 网址:https://www.luogu.org/problemnew/show/3721 大意: 有一颗单旋Splay(Spaly),以key值为优先度,总共有5个操作. [1] 插入一个 ...
- HNOI2017单旋
单旋 这道题做法贼多,LCT,splay,线段树什么的貌似都行. 像我这种渣渣只会线段树了(高级数据结构学了也不会用). 首先离线所有操作,因为不会有两个点值重复,所以直接离散. 一颗线段树来维护所有 ...
随机推荐
- BZOJ 2876 【NOI2012】 骑行川藏
题目链接:骑行川藏 听说这道题需要一些高数知识 于是膜了一发dalao的题解……然后就没了…… 不要吐槽我的精度TAT……eps设太小了就TLE,大了就Wa……我二分的边界是对着数据卡的…… 下面贴代 ...
- rails安装使用版本控制器的原因。
使用版本控制器的原因: 你没有系统根权限,所以你没有别的选择 你想要分开运行几个rails 系统 ,并且这几个rails有不同的Ruby版本.使用RVM就可以轻松做到. 没有什么新鲜的先安装xcode ...
- HDU - 4812 D Tree 点分治
http://acm.hdu.edu.cn/showproblem.php?pid=4812 题意:有一棵树,每个点有一个权值要求找最小的一对点,路径上的乘积mod1e6+3为k 题解:点分治,挨个把 ...
- MyBatis Generator去掉生成的注解
是不是很讨厌mybatis Generator帮我们生成代码的时候在Mapper和mapper.xml文件中生成的一大堆注解?今天在看MyBatis Generator代码的时候发现,原来mybati ...
- hdu1512
题解: 每一次合并两个对 修改操作就和普通的堆一样 代码: #include<cstring> #include<cmath> #include<cstdio> # ...
- .net 应用程序 发布上线注意事项
生产环境发布时,对应的程序目录必须新建当日rar压缩包进行备份生产环境数据库发布时,必须创建存储过程的副本sql用于回滚,操作方式:F7调出对象资源管理器详细信息->选中所有存储过程->编 ...
- Android EditText 中hint文字大小以及与输入文字颜色保存一致
SpannableString 这个就是用来处理android 文本信息 可编辑 可点击 感兴趣的自己去看! /* * Copyright (C) 2006 The Android Open Sour ...
- linux磁盘分区格式化-fdisk命令工具
本文主要讲述使用fdisk工具对磁盘进行分区和格式化的方法 首先要明确分区是针对磁盘进行的操做,磁盘分区会创建分区表,类似vda,sda的是磁盘,vda1,sda1的是分区 1.查看磁盘分区状态 1. ...
- PyalgoTrade 计算权重平滑平均价(三)
本节介绍如何使用收盘价的SMA价格的策略 from pyalgotrade import strategy from pyalgotrade.barfeed import yahoofeed from ...
- (转)ZooKeeper-3.3.4集群安装配置
转载于 千与 的 http://blog.csdn.net/shirdrn/article/details/7183503 ZooKeeper是一个分布式开源框架,提供了协调分布式应用的基本服务,它向 ...