bzoj P4825 [Hnoi2017]单旋——solution
Description
Input
Output
Sample Input
1 2
1 1
1 3
4
5
Sample Output
2
2
2
2
#include<map>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
map<int ,int > MAP;
int m,top;
struct DT{
int ch[],CH[],fa,FA;
int size,num;
};
struct Splay{
DT data[];
void splay(int x){
int fa,fafa;
for(fa=data[x].fa;che(x);roll(x),fa=data[x].fa){
fafa=data[fa].fa;
if(che(fa)){
if((data[fa].ch[]==x)^(data[fafa].ch[]==fa))
roll(x);
else
roll(fa);
}
}
}
void roll(int x){
int fa=data[x].fa,fafa=data[fa].fa,wh=data[fa].ch[]==x;
data[fa].ch[wh]=data[x].ch[wh^],data[data[fa].ch[wh]].fa=fa;
data[fa].fa=x,data[x].ch[wh^]=fa;
data[x].fa=fafa;
if(data[fafa].ch[]==fa||data[fafa].ch[]==fa)
data[fafa].ch[data[fafa].ch[]==fa]=x;
up(fa),up(x);
}
bool che(int x){
return data[data[x].fa].ch[]==x||data[data[x].fa].ch[]==x;
}
void up(int x){
data[x].size=data[data[x].ch[]].size+data[data[x].ch[]].size+;
}
};
struct LCT{
Splay T;
int root;
void Mak_data(int id,int num){
T.data[id].ch[]=T.data[id].ch[]=T.data[id].CH[]=T.data[id].CH[]=;
T.data[id].FA=T.data[id].fa=;
T.data[id].size=,T.data[id].num=num;
}
void Link(int fa,int son,int wh){
Access(son),T.splay(son);
T.data[son].FA=fa;
T.data[son].fa=fa;
T.data[fa].CH[wh]=son;
Access(son);
}
void Cut(int fa,int son){
Access(fa),T.splay(son);
T.data[son].FA=T.data[son].fa=;
T.data[fa].CH[T.data[fa].CH[]==son]=;
}
void Access(int x){
int y=;
while(x){
T.splay(x);
T.data[x].ch[]=y,T.up(x);
y=x,x=T.data[x].fa;
}
}
};
LCT lct;
inline void in(int &ans)
{
ans=;bool p=false;char ch=getchar();
while((ch>'' || ch<'')&&ch!='-') ch=getchar();
if(ch=='-') p=true,ch=getchar();
while(ch<=''&&ch>='') ans=ans*+ch-'',ch=getchar();
if(p) ans=-ans;
}
int main()
{
int i,j,k,templ,tempr,temp,f,c;
map<int ,int >::iterator iter;
in(m);
lct.root=;
for(i=;i<=m;i++){
in(j);
if(j==){
in(k);
lct.Mak_data(++top,k);
if(lct.root){
iter=MAP.upper_bound(k);
tempr=iter->second,templ=;
if(iter!=MAP.begin())iter--,templ=iter->second;
if(templ&&!lct.T.data[templ].CH[])
lct.Link(templ,top,);
else
lct.Link(tempr,top,);
}
else
lct.root=top;
lct.Access(top),lct.T.splay(top);
printf("%d\n",lct.T.data[top].size);
MAP[k]=top;
}
else{
iter=MAP.end(),iter--;
if(j&)
temp=iter->second;
else
temp=MAP.begin()->second;
lct.Access(temp),lct.T.splay(temp);
printf("%d\n",lct.T.data[temp].size);
if(lct.T.data[temp].FA&&lct.T.data[temp].CH[!(j&)]){
f=lct.T.data[temp].FA,c=lct.T.data[temp].CH[!(j&)];
lct.Cut(temp,c),lct.Cut(f,temp);
lct.Link(f,c,j&);
}
else{
if(lct.T.data[temp].FA||lct.T.data[temp].CH[!(j&)])
if(lct.T.data[temp].FA)
lct.Cut(lct.T.data[temp].FA,temp);
else
lct.root=lct.T.data[temp].CH[!(j&)],lct.Cut(temp,lct.T.data[temp].CH[!(j&)]);
else{
if(j>)
lct.root=,MAP.erase(lct.T.data[temp].num);
continue;
}
}
if(j<)
lct.Link(temp,lct.root,!(j&)),lct.root=temp;
else
MAP.erase(lct.T.data[temp].num);
}
}
}
bzoj P4825 [Hnoi2017]单旋——solution的更多相关文章
- bzoj 4825: [Hnoi2017]单旋 [lct]
4825: [Hnoi2017]单旋 题意:有趣的spaly hnoi2017刚出来我就去做,当时这题作死用了ett,调了5节课没做出来然后发现好像直接用lct就行了然后弃掉了... md用lct不知 ...
- 【刷题】BZOJ 4825 [Hnoi2017]单旋
Description H 国是一个热爱写代码的国家,那里的人们很小去学校学习写各种各样的数据结构.伸展树(splay)是一种数据结构,因为代码好写,功能多,效率高,掌握这种数据结构成为了 H 国的必 ...
- BZOJ:4825: [Hnoi2017]单旋
Description H 国是一个热爱写代码的国家,那里的人们很小去学校学习写各种各样的数据结构.伸展树(splay)是一种数据结构,因为代码好写,功能多,效率高,掌握这种数据结构成为了 H 国的必 ...
- bzoj 4825: [Hnoi2017]单旋【dfs序+线段树+hash】
这个代码已经不是写丑那么简单了--脑子浆糊感觉np++分分钟想暴起打死我--就这还一遍A过了-- 先都读进来hash一下,因为是平衡树所以dfs序直接按照点值来就好 对于每个操作: 1:set维护已插 ...
- 【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 国的必 ...
随机推荐
- 记录php漏洞--宇宙最强语言 PHP 爆出 DoS 漏洞,可以直接灌满 CPU
站长之家(Chinaz.com)5月20日消息 近日,PHP被爆出存在远程DOS漏洞,若黑客利用该漏洞构造PoC发起连接,容易导致目标主机CPU被迅速消耗.此漏洞涉及众多PHP版本,因而影响范围极大 ...
- 聊聊并发(三)Java线程池的分析和使用
1. 引言 合理利用线程池能够带来三个好处.第一:降低资源消耗.通过重复利用已创建的线程降低线程创建和销毁造成的消耗.第二:提高响应速度.当任务到达时,任务可以不需要的等到线程创建就能立即执行. ...
- Android多媒体整体架构图
Android多媒体整体架构图 MediaPlayer框架图 Camera框架图 SoundRecorder框架图 VideoCamera框架图 OpenCore与Skia ALSA Audio框架图 ...
- How React Works (一)首次渲染
How React Works (一)首次渲染 一.前言 本文将会通过一个简单的例子,结合React源码(v 16.4.2)来说明 React 是如何工作的,并且帮助读者理解 ReactElement ...
- python的 del 函数是删对象还是删引用
1.首先介绍下python的对象引用 1)Python中不存在传值调用,一切传递的都是对象引用,也可以认为是传址调用.即Python不允许程序员选择采用传值或传引用.Python参数传递采用的是“传对 ...
- oracle_jdbc_Query
本例子程序是根据马士兵老师所讲+自己的注释.写的比较全面,特别是最后释放资源的代码. package com.ayang.jdbc; import java.sql.*; public class T ...
- Android硬件抽象层(HAL)深入剖析(三)【转】
前面分析了android HAL层是如何搜索硬件模块的动态共享库的,其实就是在"system/lib/hw/"或者"/vendor/lib/hw/"这两个路径下 ...
- notepad++上搭建gtk+2.0/3.x开发环境
前言 老师布置了一道题需要用到图形界面,于是开始找图形库.最后选择了gtk+图形库,然后折腾了大概一天. 这里记录自己新学到的知识,同时也给后来者一些便利. 准备 下载以下内容 notepad++(由 ...
- android学习-Toast的延迟时间
一般显示Toast都是一条语句够了 Toast.makeText(Context context, CharSequence text, int duration) Context是要显示Toast的 ...
- Python 日期时间处理模块学习笔记
来自:标点符的<Python 日期时间处理模块学习笔记> Python的时间处理模块在日常的使用中用的不是非常的多,但是使用的时候基本上都是要查资料,还是有些麻烦的,梳理下,便于以后方便的 ...