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,线段树什么的貌似都行. 像我这种渣渣只会线段树了(高级数据结构学了也不会用). 首先离线所有操作,因为不会有两个点值重复,所以直接离散. 一颗线段树来维护所有 ...
随机推荐
- ExtJS错误解决 Cannot read property 'on' of undefined
背景 用ExtJS新写了一个功能,运行时控制台打印错误Cannot read property 'on' of undefined,出错代码位置是Ext.define.bindStoreListene ...
- postman中如何使用OAuth
https://learning.getpostman.com/docs/postman/sending_api_requests/authorization/ Authorization The a ...
- 创建maven或者Gradle项目的时候GroupId和ArtifactId以及Version是什么意思?
GroupId 是项目组织的唯一标识符,在实际开发中对应JAVA的包的结构,就是main目录里java的目录结构,如 ‘com.itcast.demo’. ArtifactId是项目的唯一标识符,在实 ...
- ffmpeg_资料_01
1. 用ffmpeg制作推流工具,实现推流系统声音和桌面到rtmp服务器-CSDN论坛-CSDN.NET-中国最大的IT技术社区.html http://bbs.csdn.net/topics/392 ...
- Java Redis的Pipeline管道,批量操作,节省大量网络往返时间 & Redis批量读写(hmset&hgetall) 使用Pipeline
一般情况下,大家使用redis去put/get都是先拿到一个jedis实例,然后操作,然后释放连接:这种模式是 请求-响应,请求-响应 这种模式,下一次请求必须得等第一次请求响应回来之后才可以,因为r ...
- recv,recvfrom,send,sendto
一般情况下:send(),recv()用于TCP,sendto()及recvfrom()用于UDP 但是send(),recv()也可以用于UDP,sendto()及recvfrom()也可以用于TC ...
- [ccf 4] 网络延时
网络延时 问题描述 给定一个公司的网络,由n台交换机和m台终端电脑组成,交换机与交换机.交换机与电脑之间使用网络连接.交换机按层级设置,编号为1的交换机为根交换机,层级为 1.他的交换机都连 ...
- 通过Ftp put命令上传导致文件损坏的解决办法
通过Linux命令行向在一台Windows FTP服务器上传文件.然后在另一台Windows客户机登录FTP服务器下载,但是下载后的文件大小变了,exe文件错误了不能正确执行.刻意打包的文件(.rar ...
- Memcached介绍及相关知识
memcached简介 1.memcached是一个免费开源的.高性能的,具有分布式内存对象的缓存系统.memcached通过在内存里维护一个统一的巨大的hash表,它能够用来存储各种格式的数据,包括 ...
- 程序级的AOP到底好不好?
很多年前模拟过Spring的AOP机制,简单的实现其实不难,但真正要保证切入代码符合预期的设计,不会引起负面影响,特别是要保证原来逻辑的稳定性,即AOP的强壮性.个人感觉还是很难,如果横切的代码过多, ...