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 国的必 ...
随机推荐
- Libevent源码分析 (1) hello-world
Libevent源码分析 (1) hello-world ⑨月份接触了久闻大名的libevent,当时想读读源码,可是由于事情比较多一直没有时间,现在手头的东西基本告一段落了,我准备读读libeven ...
- php iconv 函数参数的区别
本文同时发表在https://github.com/zhangyachen/zhangyachen.github.io/issues/57 用户输入:英特尔® 酷睿™ i7处理器大显身手 case1 ...
- ArcGIS 网络分析[8.1] 资料1 使用AO打开或创建网络数据集之【打开】
为了创建或打开一个网络数据集,你必须使用NetworkDatasetFDExtension对象(文件地理数据库中的数据集)或NetworkDatasetWorkspaceExtension对象(对于S ...
- 微信JS-SDK使用步骤(以微信扫一扫为例)
概述: 微信JS-SDK是微信公众平台面向网页开发者提供的基于微信内的网页开发工具包. 通过使用微信JS-SDK,网页开发者可借助微信高效地使用拍照.选图.语音.位置等手机系统的能力,同时可以直接使用 ...
- c#的关键字
abstract as base bool break byte case catch char checked decimal default delegate continue double do ...
- 深入理解 Python 异步编程(上)
http://python.jobbole.com/88291/ 前言 很多朋友对异步编程都处于"听说很强大"的认知状态.鲜有在生产项目中使用它.而使用它的同学,则大多数都停留在知 ...
- css 背景色渐变兼容写法
最近在项目中,有很多地方都用到了线性渐变,比如:表单提交按钮的背景,数据展示的标题背景等等,按照以前的做法是切 1px 图片然后 repeat-x.下面我将介绍如何用 css 来完成该效果. css3 ...
- ABP .Net Core 日志组件集成使用NLog
一.说明 NLog介绍和使用说明官网:http://nlog-project.org/ NLog和Log4net对比:https://www.cnblogs.com/qinjin/p/5134982. ...
- sql优化原则与技巧
加快sql查询是非常重要的技巧,简单来说加快sql查询的方式有以下几种:一.索引的引用 1.索引一般可以加速数据的检索速度,加速表与表之间的链接,提高性能,所以在对海量数据进行处理时,考虑到信息量比较 ...
- grpc介绍
grpc入门(一) 一.什么是grpc grpc是谷歌开源的一款高性能的rpc框架 (https://grpc.io),可以使用protocol buffers作为IDL(Interface Defi ...