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 国的必 ...
随机推荐
- ESP8266 wifi干扰、钓鱼实现
说明:绝大部分都是对着下面的参考文章来做的.这里只把基本流程和我自己遇到的问题写一下.如有其他问题可以访问文章末的参考文章进行查找! esp8266模块 我们需要购买一块esp8266模块,如下图所示 ...
- Apache TraceEnable关闭与测试方法
系统环境:OS: RHEL5.6_x64Apache: httpd-2.2.11 关闭方法:在主配置文件httpd.conf中添加配置:TraceEnable off可以直接配置在ServerRoot ...
- 正则表达式学习之grep,sed和awk
正则表达式是用于描述字符排列和匹配模式的一种语法,它主要用于字符串的模式分割.匹配.查找以及替换操作. 描述一个正则表达式需要字符类.数量限定符.位置限定符.规定一些特殊语法表示字符类,数量限定符和位 ...
- HTML简单登录和注册页面及input标签诠释
今天第一次接触HTML这种语言,虽然不能完全理解其中的意思,过去学的英语单词几乎也忘了差不多了,但是感觉进入这门语言学习之后就没有那么难了,一步一步来吧!下面巩固下今天学内容: HTML是一种超文本标 ...
- 【learning】微信跳一跳辅助c++详解 轻松上万 【上】
写在前面 17年年底Wechat出了这个跳一跳的小游戏,今年2月份的时候简单地玩了一下,发现被游戏虐了(手太残了只能跳20多). 今天刚好有点空,于是就花了一个下午的时间写了一个跳一跳的c++ ...
- Fiddler4抓包工具使用教程一
本文参考自http://blog.csdn.net/ohmygirl/article/details/17846199,纯属读书笔记,加深记忆 1.抓包工具有很多,为什么要使用Fiddler呢?原因如 ...
- 解决waveInOpen录音编译x64程序出错的问题
1.之前也碰到过x86程序升级为x64程序,关键点是类型大小的使用. 之前同事碰到过一个用int表示指针的程序,程序改为x64会出错,找原因找了半天. 2.今天我也碰到了,使用aveInOpen录音, ...
- android 判断service是否正在运行
public static boolean isServiceExisted(Context context, String className) { ActivityManager activity ...
- 【原】Ubuntu13.04安装、卸载Gnome3.8
添加 GNOME 3 PPA(Personal Package Archives) 我们先给Ubuntu的Software Sources增加GNOME 3 PPA.这可以不用命令行就做到,但出于简单 ...
- jdk1.8以前不建议使用其自带的Base64来加解密
JDK1.8之前的base64是内部测试使用的代码,不建议生产环境使用,而且未来可能会移除, JDK1.8提供最新可以正式使用的Base64类, 不要使用JDK中自带的sun.misc.BASE64D ...