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 国的必 ...
随机推荐
- Swift 4.0 废弃的柯里化
// 柯里化 // http://www.jianshu.com/p/6eaacadafa1a Swift 2.0 柯里化方法 (废弃) / ...
- LeetCode题解-23 合并K个排序链表 Hard
合并 k 个排序链表,返回合并后的排序链表.请分析和描述算法的复杂度. 示例: 输入: [ 1->4->5, 1->3->4, 2->6 ] 输出: 1->1-&g ...
- C语言-apache mod(模块开发)-采用VS2017开发实战(windows篇)
C语言-apache mod(模块开发)-采用VS2017开发实战(windows篇) 名词解释:apxs apxs is a tool for building and installing ext ...
- 解决ajax跨域问题的一种方法
解决ajax跨域问题的一种方法 前后端分离经常用json来传输数据,比较常见的问题就有ajax跨域请求的错误问题,这里是我的一种解决方法: 在java中加入如下的注解类: import org.spr ...
- php生成markdown格式的数据库字典
<?php /** * 生成mysql数据字典 */ //数据库配置 $config = [ 'host' => '192.168.43.134', 'user' => 'root' ...
- Cloudera Manager安装之利用parcels方式安装3或4节点集群(包含最新稳定版本或指定版本的安装)(添加服务)(CentOS6.5)(五)
参考博客 Cloudera Manager安装之利用parcels方式安装单节点集群 Cloudera Manager安装之Cloudera Manager 5.3.X安装(三)(tar方式.rpm ...
- Go 程序执行顺序
在一个 go 程序中通常包含:包.常量.变量.init().main()等元素,如果同时存在多个包,包之间存在依赖关系,每个包中存在多个 init 函数,每个文件中存在多个 init 函数,那么问题来 ...
- 数据库应用(Mysql、Mongodb、Redis、Memcached、CouchDB、Cassandra)
目前,主流数据库包括关系型(SQL)和非关系型(NoSQL)两种. 关系数据库是建立在关系模型基础上的数据库,借助于集合代数等数学概念和方法来处理数据库中的数据,支持复杂的事物处理和结构化查询.代表实 ...
- WPF获取相对位置、坐标的方法
1.获取鼠标在控件中的坐标: private void item_MouseDown(object sender, MouseButtonEventArgs e) { Point point = e. ...
- php使用date()函数时,提示的警告
转载:http://www.shangxueba.com/jingyan/121682.html 在用PHP5.3以上的PHP版本时,只要是涉及时间的会报一个: "PHP Warning: ...