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 国的必 ...
随机推荐
- setInterval传递参数
参照:https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/setTimeout 平时我们使用定时器的时 ...
- 【wireshark】Wireshark原理分析与二次开发系列
1.版权声明 本系列文章是本人花了很多心血写成,wireshark本是开源软件,本人也乐于技术知识和经验的分享,更是欣赏和推崇开源精神,因此任何看到本文的人都可以随意转载,但只有一个要求: 在大段甚至 ...
- jmeter 中使用ServerAgen链接超时可能出错的原因之一ip不对
因为我要压测的服务器是需要使用跳板机转发链接的,所以我开始用的是跳板机的IP+ServerAgen端口,发现连不通,实际上应该使用ServerAgen所在服务器的IP,如果:
- 自己搞了20万张图片100个分类,tensorflow训练23万次后。。。。。。
自己搞了20万张图片100个分类,tensorflow训练23万次后...... 我自己把训练用的一张图片,弄乱之后做了一个预测 100个汉字,20多万张图片,tensorflow CNN训练23万次 ...
- commons-pool2
转载请注明源出处:http://www.cnblogs.com/lighten/p/7375611.html 1.前言 本章介绍一下常用基础Jar包commons-pools2,最近使用到了thrif ...
- 最小化或关闭Outlook2013到系统托盘
https://community.spiceworks.com/how_to/36214-minimize-and-or-close-outlook-to-taskbar 要注意里面提到的以管理员权 ...
- ES6 箭头函数 this 指向
ES6 箭头函数 this 指向 箭头函数有几个使用注意点: 函数体内的this对象,就是定义时所在的对象,而不是使用时所在的对象. 不可以当作构造函数,也就是说,不可以使用new命令,否则会抛出一个 ...
- SourceTree跳过Atlassian账号,免登陆,跳过初始设置
SourceTree 安装之后需要使用账号登陆以授权,并且是强制登陆. 登录过程非常漫长,并未在不FQ的情况下是不能成功的,下面记录一下跳过登录的方法. 装之后,转到用户本地文件夹下的 SourceT ...
- Android之ListView的使用技巧
之前有总结过关于ListView的一些优化技巧,比如它的ConvertView的复用Recycler机制,使用ViewHolder来提高列表条目的findById的效率,以及宽高的设置确定值的好处,如 ...
- OpenGL12-shader(GLSL)着色语言3-(属性参数)(代码已上传)
上一个例程中,使用了uniform 类型的变量,uniform可以理解为全局变量,这一节中使用 的是attribute类型的变量,翻译过来就是属性,他是与顶点绑定的,就意味着一个顶点可以 有很多个属性 ...