BZOJ:4825: [Hnoi2017]单旋
Description

Input
Output
Sample Input
1 2
1 1
1 3
4
5
Sample Output
2
2
2
2
#include<cstdio>
#include<cstring>
#include<algorithm>
#define MN 210010
using namespace std; int p,ca,f;
inline int read(){
p=;ca=getchar();f=;
while(ca<''||ca>'') {if (ca=='-') f=-;ca=getchar();}
while(ca>=''&&ca<='') p=p*+ca-,ca=getchar();
return p*f;
}
struct tree{int l,r,ra,k,t;}T[MN];
struct na{int y,ne,c,nu;}b[MN*];
int fa[MN],n,m,t,x,y,c,num,id[MN],key[MN],ch[MN][],ma[MN],st[MN],si[MN],NUM=,T_ro=,cnt=,size=,hav[MN][],Fa[MN];
bool rt[MN],rev[MN];
inline int max(int a,int b){return a>b?a:b;}
inline void lef(int &p){
int k=T[p].l;
T[p].l=T[k].r;
T[k].r=p;
p=k;
}
inline void rig(int &p){
int k=T[p].r;
T[p].r=T[k].l;
T[k].l=p;
p=k;
}
int T_askmax(int p,int k){
if (!p) return ;
int u;
if (k<T[p].k) return (u=T_askmax(T[p].l,k))?u:T[p].t;else return T_askmax(T[p].r,k);
}
int T_askmin(int p,int k){
if (!p) return ;
int u;
if (k>T[p].k) return (u=T_askmin(T[p].r,k))?u:T[p].t;else return T_askmin(T[p].l,k);
}
void T_DEL(int &p){
if (!T[p].l&&!T[p].r) p=;else
if (!T[p].r) lef(p),T_DEL(T[p].r);else
if (!T[p].l) rig(p),T_DEL(T[p].l);else
if (T[T[p].l].ra<T[T[p].r].ra) lef(p),T_DEL(T[p].r);else rig(p),T_DEL(T[p].l);
}
void T_del(int &p,int k){if (T[p].k==k) T_DEL(p);else if (k<T[p].k) T_del(T[p].l,k);else T_del(T[p].r,k);}
void T_in(int &p,int k,int v){
if (!p){
p=++num;
T[p].k=k;T[p].t=v;T[p].l=T[p].r=;T[p].ra=rand();
return;
}
if (T[p].k>k){
T_in(T[p].l,k,v);
if (T[T[p].l].ra<T[p].ra) lef(p);
}else{
T_in(T[p].r,k,v);
if (T[T[p].r].ra<T[p].ra) rig(p);
}
}
int T_min(int p){return T[p].l?T_min(T[p].l):p;}
int T_max(int p){return T[p].r?T_max(T[p].r):p;}
inline void up(int x){si[x]=si[ch[x][]]+si[ch[x][]]+;}
inline void pd(int x){if (rev[x]) swap(ch[x][],ch[x][]),rev[ch[x][]]^=,rev[ch[x][]]^=,rev[x]=;}
inline void rot(int x){
int y=fa[x],kind=ch[y][]==x;
fa[x]=fa[y];
fa[y]=x;
ch[y][kind]=ch[x][!kind];
fa[ch[y][kind]]=y;
ch[x][!kind]=y;
if(rt[y]) rt[y]=,rt[x]=;else ch[fa[x]][ch[fa[x]][]==y]=x;
up(y);up(x);
}
inline void splay(int x){
int i=x,to=;
while (!rt[i]) st[++to]=i,i=fa[i];pd(i);
for (;to;to--) pd(st[to]);
while(!rt[x]){
if (rt[fa[x]]) rot(x);else
if ((ch[fa[fa[x]]][]==fa[x])==(ch[fa[x]][]==x)) rot(fa[x]),rot(x);else rot(x),rot(x);
}
}
inline void acc(int u){
int x=;
while(u){
splay(u);
rt[ch[u][]]=;rt[ch[u][]=x]=;si[u]+=si[x];
up(u);
u=fa[x=u];
}
}
inline void root(int x){acc(x);splay(x);rev[x]^=;}
inline void link(int x,int y){
acc(x);splay(x);fa[y]=x;
printf("%d\n",si[x]+);
}
int find(int x){return ch[x][]?find(ch[x][]):x;}
char ss[];
int main(){
m=read();
while (m--){
t=read();
if (t==){
t=read();rt[++cnt]=;si[cnt]=;size++;
if (size==){
T_in(T_ro,t,cnt);
fa[cnt]=;Fa[cnt]=;
puts("");
}else{
if (x=T_askmin(T_ro,t),!hav[x][]&&x) hav[x][]=cnt,link(x,cnt),Fa[cnt]=x;else
if (x=T_askmax(T_ro,t),!hav[x][]&&x) hav[x][]=cnt,link(x,cnt),Fa[cnt]=x;
T_in(T_ro,t,cnt);
}
}else if (t==){
t=T[T_min(T_ro)].t;
if (Fa[t]==){
puts("");
continue;
}
acc(t);acc(Fa[t]);splay(Fa[t]);printf("%d\n",si[Fa[t]]+);x=find(Fa[t]);
if (hav[t][]) splay(hav[t][]),fa[hav[t][]]=fa[t],Fa[hav[t][]]=Fa[t];hav[Fa[t]][]=hav[t][];
splay(x);fa[x]=Fa[x]=t;hav[t][]=x;fa[t]=Fa[t]=;
}else if (t==){
size--;
t=T_min(T_ro);T_del(T_ro,T[t].k);t=T[t].t;
if (Fa[t]==){
puts("");
acc(hav[t][]);acc(t);Fa[hav[t][]]=fa[hav[t][]]=;
continue;
}
acc(t);acc(Fa[t]);splay(Fa[t]);printf("%d\n",si[Fa[t]]+);
if (hav[t][]) splay(hav[t][]),fa[hav[t][]]=fa[t],Fa[hav[t][]]=Fa[t];hav[Fa[t]][]=hav[t][];
}else if (t==){
t=T[T_max(T_ro)].t;
if (Fa[t]==){
puts("");
continue;
}
acc(t);acc(Fa[t]);splay(Fa[t]);printf("%d\n",si[Fa[t]]+);x=find(Fa[t]);
if (hav[t][]) splay(hav[t][]),fa[hav[t][]]=fa[t],Fa[hav[t][]]=Fa[t];hav[Fa[t]][]=hav[t][];
splay(x);fa[x]=Fa[x]=t;hav[t][]=x;fa[t]=Fa[t]=;
}else if (t==){
size--;
t=T_max(T_ro);T_del(T_ro,T[t].k);t=T[t].t;
if (Fa[t]==){
puts("");
acc(hav[t][]);acc(t);Fa[hav[t][]]=fa[hav[t][]]=;
continue;
}
acc(t);acc(Fa[t]);splay(Fa[t]);printf("%d\n",si[Fa[t]]+);
if (hav[t][]) splay(hav[t][]),fa[hav[t][]]=fa[t],Fa[hav[t][]]=Fa[t];hav[Fa[t]][]=hav[t][];
}
}
}
BZOJ:4825: [Hnoi2017]单旋的更多相关文章
- bzoj 4825: [Hnoi2017]单旋 [lct]
4825: [Hnoi2017]单旋 题意:有趣的spaly hnoi2017刚出来我就去做,当时这题作死用了ett,调了5节课没做出来然后发现好像直接用lct就行了然后弃掉了... md用lct不知 ...
- 【刷题】BZOJ 4825 [Hnoi2017]单旋
Description H 国是一个热爱写代码的国家,那里的人们很小去学校学习写各种各样的数据结构.伸展树(splay)是一种数据结构,因为代码好写,功能多,效率高,掌握这种数据结构成为了 H 国的必 ...
- bzoj 4825: [Hnoi2017]单旋【dfs序+线段树+hash】
这个代码已经不是写丑那么简单了--脑子浆糊感觉np++分分钟想暴起打死我--就这还一遍A过了-- 先都读进来hash一下,因为是平衡树所以dfs序直接按照点值来就好 对于每个操作: 1:set维护已插 ...
- 4825: [Hnoi2017]单旋
4825: [Hnoi2017]单旋 链接 分析: 以后采取更保险的方式写代码!!!81行本来以为不特判也可以,然后就总是比答案大1,甚至出现负数,调啊调啊调啊调~~~ 只会旋转最大值和最小值,以最小 ...
- bzoj P4825 [Hnoi2017]单旋——solution
Description H 国是一个热爱写代码的国家,那里的人们很小去学校学习写各种各样的数据结构.伸展树(splay)是一种数据 结构,因为代码好写,功能多,效率高,掌握这种数据结构成为了 H 国的 ...
- [BZOJ4825][HNOI2017]单旋(线段树+Splay)
4825: [Hnoi2017]单旋 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 667 Solved: 342[Submit][Status][ ...
- 【LG3721】[HNOI2017]单旋
[LG3721][HNOI2017]单旋 题面 洛谷 题解 20pts 直接模拟\(spaly\)的过程即可. 100pts 可以发现单旋最大.最小值到根,手玩是有显然规律的,发现只需要几次\(lin ...
- 【BZOJ4825】[Hnoi2017]单旋 线段树+set
[BZOJ4825][Hnoi2017]单旋 Description H 国是一个热爱写代码的国家,那里的人们很小去学校学习写各种各样的数据结构.伸展树(splay)是一种数据结构,因为代码好写,功能 ...
- bzoj4825 [Hnoi2017]单旋
Description H 国是一个热爱写代码的国家,那里的人们很小去学校学习写各种各样的数据结构.伸展树(splay)是一种数据结构,因为代码好写,功能多,效率高,掌握这种数据结构成为了 H 国的必 ...
随机推荐
- iOS 使用 CATransform3D 处理 3D 影像、制做互动立体旋转的效果
1. Swift http://www.cocoachina.com/swift/20170518/19305.html domehttps://pan.baidu.com/s/1i4XXSkH OC ...
- 三菱Q系列PLC的io分配
1.系统基本配置 2.存储卡配置 3.外部IO标号 4.主基板IO模块的IO号分配 5.扩展基板IO口标号 6.标准配置实例 7. 一.输入采样阶段 在输入采样阶段,可编程逻辑控制器以扫描方式依次地读 ...
- CSS 水平居中/布局 垂直居中 (月经问题)
水平居中 如果它是一个行内元素 对其父元素使用 text-align:center 即可实现. <p style = " text-align:center; width:300px; ...
- PredictionIO+Universal Recommender快速开发部署推荐引擎的问题总结(1)
1,PredictionIO如果用直接下载的0.11.0-incubating版本,存在一个HDFS配置相关的BUG 执行pio status命令时会发生如下的错误: -- ::, ERROR org ...
- 扩展Microsoft Graph数据结构(开放扩展)
作者:陈希章 发表于 2018年1月2日 前言 Microsoft Graph是一张拥有巨大价值的网络,它定义了包括Office 365在内的资源的实体及其关系,它的价值体现在,随着用户积累的数据越来 ...
- SQL企业级面试题
链接:90root MySQL企业面试题 1. 开发有一堆数据插入,如何防止插入的中文数据产生乱码? 2. 如何批量更改数据库表的引擎,如:myisam改为innodb 3. 如何批量更改数据库字符集 ...
- 为什么要学ADO.NET。。。什么是ADO.NET。。。
之前学的 •只能在查询分析器里查看数据,操作数据,我们不能让普通用户去学sql,所以我们搭建一个界面(Web Winform)让用户方便的操作数据库中的数据. •ADO.NET就是一组类库,这组类 ...
- NumPy学习笔记 二
NumPy学习笔记 二 <NumPy学习笔记>系列将记录学习NumPy过程中的动手笔记,前期的参考书是<Python数据分析基础教程 NumPy学习指南>第二版.<数学分 ...
- Java自己动手写连接池一
自己动手写连接池,废话不多说,直接上代码,读取配置文件 package com.kama.cn; import java.io.IOException;import java.io.InputStre ...
- 在表格中,th scope="row"和th scope="col"中的scope属性的用法及意义
把表头和数据联系起来:scope,id,headers属性就我用到现在,很多表格要比上面提供的例子复杂的多.让例子复杂一点,我会移去"Company"表头,并且把第一列的数据移到表 ...