BZOJ

Luogu

题目太长了,就不放了。

题解

首先声明一点,无论是splay还是spaly,插入一个新的元素,都要rotate到根!所以说题目也算是给了一个错误示范吧。

我们发现把最值旋转到根并不会给这棵spaly造成多大的形态改变,所以考虑用LCT维护这个spaly的形态。

每次插入的时候我们用一个Set来找出插入元素的前驱后继。可以证明,一定会插在前驱或者是后继的对应左右儿子上。判断一下插入即可。除了LCT里的splay外,还要维护一下原树中(spaly中)的父亲、左右儿子关系。

code

细节。。还好吧

我tm又双叒叕把一个l打成r了

#include<cstdio>
#include<algorithm>
#include<map>
#include<set>
using namespace std;
const int N = 100005;
int fa[N],ls[N],rs[N],rev[N],sz[N],Stack[N],top;
int gi()
{
int x=0,w=1;char ch=getchar();
while ((ch<'0'||ch>'9')&&ch!='-') ch=getchar();
if (ch=='-') w=0,ch=getchar();
while (ch>='0'&&ch<='9') x=(x<<3)+(x<<1)+ch-'0',ch=getchar();
return w?x:-x;
}
bool isroot(int x){return ls[fa[x]]!=x&&rs[fa[x]]!=x;}
void pushup(int x){sz[x]=sz[ls[x]]+sz[rs[x]]+1;}
void pushdown(int x){if (!rev[x]) return;swap(ls[x],rs[x]);rev[ls[x]]^=1;rev[rs[x]]^=1;rev[x]=0;}
void R_rotate(int x)
{
int y=fa[x],z=fa[y];
ls[y]=rs[x];
if (rs[x]) fa[rs[x]]=y;
fa[x]=z;
if (!isroot(y)) if (y==ls[z]) ls[z]=x;else rs[z]=x;
rs[x]=y;fa[y]=x;
pushup(y);
}
void L_rotate(int x)
{
int y=fa[x],z=fa[y];
rs[y]=ls[x];
if (ls[x]) fa[ls[x]]=y;
fa[x]=z;
if (!isroot(y)) if (y==ls[z]) ls[z]=x;else rs[z]=x;
ls[x]=y;fa[y]=x;
pushup(y);
}
void splay(int x)
{
Stack[top=1]=x;
for (int i=x;!isroot(i);i=fa[i])
Stack[++top]=fa[i];
while (top) pushdown(Stack[top--]);
while (!isroot(x))
{
int y=fa[x],z=fa[y];
if (isroot(y))
if (x==ls[y]) R_rotate(x);
else L_rotate(x);
else
if (y==ls[z])
if (x==ls[y]) R_rotate(y),R_rotate(x);
else L_rotate(x),R_rotate(x);
else
if (x==ls[y]) R_rotate(x),L_rotate(x);
else L_rotate(y),L_rotate(x);
}
pushup(x);
}
void access(int x){for (int y=0;x;y=x,x=fa[x]) splay(x),rs[x]=y,pushup(x);}
void makeroot(int x){access(x);splay(x);rev[x]^=1;}
void split(int x,int y){makeroot(x);access(y);splay(y);}
void link(int x,int y){makeroot(x);fa[x]=y;}
void cut(int x,int y){split(x,y);fa[x]=ls[y]=0;}
map<int,int>M;
set<int>S;
int m,tot,root,ff[N],lson[N],rson[N];
void Insert(int x)
{
int now=++tot;
M[x]=now;
if (S.empty())
{
S.insert(x);
root=now;
puts("1");
return;
}
set<int>::iterator t=S.upper_bound(x);
if (t==S.end()||lson[M[*t]])
{
--t;
int father=M[*t];
link(now,father);rson[father]=now;ff[now]=father;
}
else
{
int father=M[*t];
link(now,father);lson[father]=now;ff[now]=father;
}
S.insert(x);
split(now,root);
printf("%d\n",sz[root]);
}
void Spl_Min()
{
int x=M[*S.begin()];
if (x==root) {puts("1");return;}
split(x,root);printf("%d\n",sz[root]);
cut(x,ff[x]);if (rson[x]) cut(x,rson[x]);
link(x,root);if (rson[x]) link(ff[x],rson[x]);
lson[ff[x]]=rson[x];if (rson[x]) ff[rson[x]]=ff[x];
ff[x]=0;ff[root]=x;rson[x]=root;
root=x;
}
void Spl_Max()
{
int x=M[*--S.end()];
if (x==root) {puts("1");return;}
split(x,root);printf("%d\n",sz[root]);
cut(x,ff[x]);if (lson[x]) cut(x,lson[x]);
link(x,root);if (lson[x]) link(ff[x],lson[x]);
rson[ff[x]]=lson[x];if (lson[x]) ff[lson[x]]=ff[x];
ff[x]=0;ff[root]=x;lson[x]=root;
root=x;
}
void Del_Min()
{
int x=M[*S.begin()];
if (x==root)
{
puts("1");
if (rson[x]) cut(x,rson[x]);
ff[root=rson[x]]=0;
S.erase(S.begin());
return;
}
split(x,root);printf("%d\n",sz[root]);
cut(x,ff[x]);if (rson[x]) cut(x,rson[x]);
if (rson[x]) link(ff[x],rson[x]);
lson[ff[x]]=rson[x];if (rson[x]) ff[rson[x]]=ff[x];
S.erase(S.begin());
}
void Del_Max()
{
int x=M[*--S.end()];
if (x==root)
{
puts("1");
if (lson[x]) cut(x,lson[x]);
ff[root=lson[x]]=0;
S.erase(--S.end());
return;
}
split(x,root);printf("%d\n",sz[root]);
cut(x,ff[x]);if (lson[x]) cut(x,lson[x]);
if (lson[x]) link(ff[x],lson[x]);
rson[ff[x]]=lson[x];if (lson[x]) ff[lson[x]]=ff[x];
S.erase(--S.end());
}
int main()
{
m=gi();
while (m--)
{
int opt=gi();
if (opt==1) Insert(gi());
if (opt==2) Spl_Min();
if (opt==3) Spl_Max();
if (opt==4) Del_Min();
if (opt==5) Del_Max();
}
return 0;
}

[BZOJ4825][HNOI2017]单旋spaly的更多相关文章

  1. [BZOJ4825][HNOI2017]单旋(线段树+Splay)

    4825: [Hnoi2017]单旋 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 667  Solved: 342[Submit][Status][ ...

  2. bzoj4825 [Hnoi2017]单旋

    Description H 国是一个热爱写代码的国家,那里的人们很小去学校学习写各种各样的数据结构.伸展树(splay)是一种数据结构,因为代码好写,功能多,效率高,掌握这种数据结构成为了 H 国的必 ...

  3. BZOJ4825: [Hnoi2017]单旋(Splay)

    题面 传送门 题解 调了好几个小时--指针太难写了-- 因为只单旋最值,我们以单旋\(\min\)为例,那么\(\min\)是没有左子树的,而它旋到根之后,它的深度变为\(1\),它的右子树里所有节点 ...

  4. BZOJ4825 [Hnoi2017]单旋 【线段树】

    题目链接 BZOJ4825 题解 手模一下操作,会发现一些很优美的性质: 每次旋到根,只有其子树深度不变,剩余点深度\(+1\) 每次旋到根,[最小值为例]右儿子接到其父亲的左儿子,其余点形态不改变, ...

  5. 【BZOJ4825】[Hnoi2017]单旋 线段树+set

    [BZOJ4825][Hnoi2017]单旋 Description H 国是一个热爱写代码的国家,那里的人们很小去学校学习写各种各样的数据结构.伸展树(splay)是一种数据结构,因为代码好写,功能 ...

  6. bzoj 4825: [Hnoi2017]单旋 [lct]

    4825: [Hnoi2017]单旋 题意:有趣的spaly hnoi2017刚出来我就去做,当时这题作死用了ett,调了5节课没做出来然后发现好像直接用lct就行了然后弃掉了... md用lct不知 ...

  7. 【LG3721】[HNOI2017]单旋

    [LG3721][HNOI2017]单旋 题面 洛谷 题解 20pts 直接模拟\(spaly\)的过程即可. 100pts 可以发现单旋最大.最小值到根,手玩是有显然规律的,发现只需要几次\(lin ...

  8. 4825: [Hnoi2017]单旋

    4825: [Hnoi2017]单旋 链接 分析: 以后采取更保险的方式写代码!!!81行本来以为不特判也可以,然后就总是比答案大1,甚至出现负数,调啊调啊调啊调~~~ 只会旋转最大值和最小值,以最小 ...

  9. 【bzoj4825】[Hnoi2017]单旋 线段树+STL-set

    题目描述 H 国是一个热爱写代码的国家,那里的人们很小去学校学习写各种各样的数据结构.伸展树(splay)是一种数据结构,因为代码好写,功能多,效率高,掌握这种数据结构成为了 H 国的必修技能.有一天 ...

随机推荐

  1. CentOS 7 NetworkManager Keeps Overwriting /etc/resolv.conf

    In CentOS or Red Hat Enterprise Linux (RHEL) 7, you can find your /etc/resolv.conf file, which holds ...

  2. 利用Azure嵌套虚拟化,解决公有云上机器不能启动的问题

    很多时候我们都会碰到因为意外重启,机器硬盘被损坏导致无法启动,或者是因为各种原因Windows上的RDP服务启动不了,Linux上的SSH无法链接等等问题.碰到这种问题基本上很难解决以前都是将VHD下 ...

  3. idea出现Error:Maven Resources Compiler: Maven project configuration required for module 'market' isn't available.

    idea出现如下错误解决办法 1.重新在Build-Rebuild project 既可以解决啦

  4. .NET Core阿里大于短信发送SDK修改以及使用

    一.问题背景 继上次七牛云SDK的问题之后(参考:http://www.cnblogs.com/OMango/p/8447480.html),在发送短信的功能上又出现了问题,我们短信服务使用的是阿里大 ...

  5. c++ 如何把RGB图像转换成HSV图像?

    CV_<bit_depth>(S|U|F)C<number_of_channels> 1--bit_depth---比特数---代表8bite,16bites,32bites, ...

  6. POJ - 1182 食物链 并查集经典

    思路:设r(x)表示节点x与根结点的关系,px表示x的根结点.记录每个节点与其父节点的关系,就能很方便知道每个节点以及和它的父节点的关系. struct node{ int par; //父亲节点 i ...

  7. 利用Apache配置本地 自定义域名

    第一步:配置 httpd.conf 开启 虚拟主机 配置模块 去掉 " Include conf/extra/httpd-vhosts.conf " 前面的" # &qu ...

  8. Win10电脑经常自动掉线、自动断网的解决方法

    近期一客户称自己使用电脑上网的时候,过一段时间莫名其妙的出现自动掉线.自动断网的情况,那么遇到这个问题该怎么办?下面装机之家分享一下Win10电脑经常自动掉线.自动断网的解决方法,以Win7系统为例. ...

  9. 5_Longest Palindromic Substring(Manacher) --LeetCode

    参考:https://www.felix021.com/blog/read.php?2040,https://segmentfault.com/a/1190000002991199 做了修改. 首先用 ...

  10. JLINK 10针J和20针JTAG接口连接方法

    我的JLINK终于用上了,哈哈,好开心,终于不用考虑是不是要借用别人的PC机了,昨天到城隍庙电子市场忙活了一下午,终于算是满载而归,呵呵,好了,下面说一下接法,其实根本不需要什么转接板什么的,直接把相 ...