BZOJ4825: [Hnoi2017]单旋(Splay)

题面

传送门

题解

调了好几个小时……指针太难写了……

因为只单旋最值,我们以单旋\(\min\)为例,那么\(\min\)是没有左子树的,而它旋到根之后,它的深度变为\(1\),它的右子树里所有节点深度不变,其它所有节点都深度\(+1\)。那么这可以看做一个区间加和单点修改的事情,可以用\(Splay\)维护

然后就是插入节点,我们在\(Splay\)里找到它的前驱和后继,那么前驱的右儿子和后继的左儿子必定只有一个是空的,而且只有深度大的那个节点是空的,然后直接把节点插入就行了

还有一个问题就是我们该怎么找\(\min\)的右子树,我们可以对于每一个点维护它在题中所说\(Spaly\)中的深度,那么\(\min\)的右子树必定是从最左边开始的连续一段区间,且每一个节点深度都大于等于\(dep_{\min}\),可以在\(Splay\)上二分找。所以还需要顺便维护一下区间最小深度

//minamoto
#include<bits/stdc++.h>
#define R register
#define inline __inline__ __attribute__((always_inline))
#define fp(i,a,b) for(R int i=(a),I=(b)+1;i<I;++i)
#define fd(i,a,b) for(R int i=(a),I=(b)-1;i>I;--i)
#define go(u) for(int i=head[u],v=e[i].v;i;i=e[i].nx,v=e[i].v)
using namespace std;
char buf[1<<21],*p1=buf,*p2=buf;
inline char getc(){return p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++;}
int read(){R int res,f=1;R char ch;while((ch=getc())>'9'||ch<'0')(ch=='-')&&(f=-1);for(res=ch-'0';(ch=getc())>='0'&&ch<='9';res=res*10+ch-'0');return res*f;
}
inline int getop(){R char ch;while((ch=getc())>'9'||ch<'0');return ch-'0';}
char sr[1<<21],z[20];int K=-1,Z=0;
inline void Ot(){fwrite(sr,1,K+1,stdout),K=-1;}
void print(R int x){if(K>1<<20)Ot();if(x<0)sr[++K]='-',x=-x;while(z[++Z]=x%10+48,x/=10);while(sr[++K]=z[Z],--Z);sr[++K]='\n';
}
const int N=1e5+5,inf=0x3f3f3f3f;
inline int min(R int x,R int y){return x<y?x:y;}
inline int max(R int x,R int y){return x>y?x:y;}
struct node;typedef node* ptr;
struct node{ptr lc,rc,fa;int sz,d,mn,t,s,c;inline node();inline void init(R int ss,R int dd){sz=1,s=ss,d=mn=dd,c=1;}inline void ppd(R int x){t+=x,d+=x,mn+=x;}inline void pd(){if(t)lc->ppd(t),rc->ppd(t),t=0;}inline ptr upd(){sz=lc->sz+rc->sz+c,mn=min(d,min(lc->mn,rc->mn));return this;}inline ptr son(R int x){return x<s?lc:rc;}
}e[N],*rt;int tot;
inline node::node(){lc=rc=fa=e;}
void rotate(ptr &rt,ptr p){ptr s=p->fa,t=s->fa;s!=rt?(t->lc==s?t->lc:t->rc)=p:rt=p;p->fa=t,s->fa=p;if(s->lc==p)s->lc=p->rc,p->rc->fa=s,p->rc=s->upd();else s->rc=p->lc,p->lc->fa=s,p->lc=s->upd();
}
void pd(ptr rt,ptr p){if(p!=rt)pd(rt,p->fa);p->pd();}
ptr splay(ptr &rt,ptr p){pd(rt,p);while(p!=rt){if(p->fa!=rt)rotate(rt,p->fa->lc==p^p->fa->fa->lc==p->fa?p:p->fa);rotate(rt,p);}return p->upd();
}
ptr push(int s,int d){ptr p=rt,las=e;while(p!=e)p->pd(),las=p,p=p->son(s);p=e+(++tot),p->init(s,d),p->fa=las;if(las!=e)(s<las->s?las->lc:las->rc)=p;return splay(rt,p);
}
ptr find(int s){ptr p=rt;while(p->son(s)!=e)p->pd(),p=p->son(s);return splay(rt,p);
}
ptr lst(int s){ptr p=find(s);if(p->s<s)return p;p->pd(),p=p->lc;while(p->rc!=e)p->pd(),p=p->rc;return p;
}
ptr nxt(int s){ptr p=find(s);if(p->s>s)return p;p->pd(),p=p->rc;while(p->lc!=e)p->pd(),p=p->lc;return p;
}
ptr Kth(int k){ptr p=rt;if(k>p->sz)return false;while(true){p->pd();if(p->lc->sz+1==k)return p;p=p->lc->sz>=k?p->lc:(k-=p->lc->sz+1,p->rc);}
}
ptr split(int l,int r){ptr s=Kth(l-1),t=Kth(r+1);splay(rt,s);return splay(s->rc,t)->lc;}
int getl(ptr p,int d){if(p==e)return 0;p->pd();int s;s=min(p->d,p->lc->mn)>=d?getl(p->rc,d)+p->lc->sz+1:getl(p->lc,d);return s;
}
int getr(ptr p,int d){if(p==e)return 0;p->pd();return min(p->d,p->rc->mn)>=d?getr(p->lc,d)+p->rc->sz+1:getr(p->rc,d);
}
int m,op,x,l,sz;ptr s,t,S,T;
int main(){
//  freopen("testdata.in","r",stdin);m=read(),rt=e,e->mn=e->d=inf,S=push(-inf,inf),T=push(inf,inf),sz=2;while(m--){op=getop();switch(op){case 1:{x=read(),++sz,s=lst(x),t=nxt(x);int D=max(s==S?0:s->d,t==T?0:t->d)+1;push(x,D),print(D);break;}case 2:{s=Kth(2),l=min(getl(rt,s->d),sz-1)-1;print(s->d),split(2,sz-1)->ppd(1);if(l>1)split(2,l+1)->ppd(-1);s=splay(rt,s),s->mn=s->d=1;break;}case 3:{s=Kth(sz-1),l=min(getr(rt,s->d),sz-1)-1;print(s->d),split(2,sz-1)->ppd(1);if(l>1)split(sz-l,sz-1)->ppd(-1);s=splay(rt,s),s->mn=s->d=1;break;}case 4:{s=Kth(2),l=min(getl(rt,s->d),sz-1)-1;print(s->d),split(2,sz-1)->ppd(1);if(l>1)split(2,l+1)->ppd(-1);s=splay(rt,s);s->lc->fa=e,s->rc->fa=s->lc,s->lc->rc=s->rc,rt=s->lc;rt->ppd(-1),--sz,rt->upd();break;}case 5:{s=Kth(sz-1),l=min(getr(rt,s->d),sz-1)-1;print(s->d),split(2,sz-1)->ppd(1);if(l>1)split(sz-l,sz-1)->ppd(-1);s=splay(rt,s);s->rc->fa=e,s->lc->fa=s->rc,s->rc->lc=s->lc,rt=s->rc;rt->ppd(-1),--sz,rt->upd();break;}}}return Ot(),0;
}

转载于:https://www.cnblogs.com/bztMinamoto/p/10735588.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/275315.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

前端不容你亵渎

大家好&#xff0c;我是若川&#xff0c;点此加我微信进源码群&#xff0c;一起学习源码。同时可以进群免费看Vue专场直播&#xff0c;有尤雨溪分享「Vue3 生态现状以及展望」背景最近我在公众号的后台收到一条留言&#xff1a;言语里充满了对前端的不屑和鄙夷&#xff0c;但仔…

用jquery阻止事件起泡

jquery使用过程中阻止事件起泡实例 1、通过返回false来取消默认的行为并阻止事件起泡。jQuery 代码:$("form").bind("submit", function() { return false; })2、通过使用 preventDefault() 方法只取消默认的行为。jQuery 代码:$("form").bind(…

利益相关者软件工程_如何向利益相关者解释用户体验的重要性

利益相关者软件工程With the ever increasing popularity of user experience (UX) design there is a growing need for good designers. However, there’s a problem for designers here as well. How can you show the importance of UX to your stakeholders and convince…

云栖大会上,阿里巴巴重磅发布前端知识图谱!

大家好&#xff0c;我是若川&#xff0c;点此加我微信进源码群&#xff0c;一起学习源码。同时可以进群免费看Vue专场直播&#xff0c;有尤雨溪分享「Vue3 生态现状以及展望」阿里巴巴前端知识图谱&#xff0c;由大阿里众多前端技术专家团历经1年时间精心整理&#xff0c;从 初…

Linux下“/”和“~”的区别

在linux中&#xff0c;”/“代表根目录&#xff0c;”~“是代表目录。Linux存储是以挂载的方式&#xff0c;相当于是树状的&#xff0c;源头就是”/“&#xff0c;也就是根目录。 而每个用户都有”家“目录&#xff0c;也就是用户的个人目录&#xff0c;比如root用户的”家“目…

在当今移动互联网时代_谁在提供当今最好的电子邮件体验?

在当今移动互联网时代Hey, a new email service from the makers of Basecamp was recently launched. The Verge calls it a “genuinely original take on messaging”, and it indeed features some refreshing ideas for the sometimes painful exercise we call inbox man…

插件式开发小记

在做插件开发时&#xff0c;小记一下&#xff0c;用来备忘&#xff1a; 1.DEV8.2的XtraTabControl控件如何获得当前打开的子窗体&#xff1a;XtraForm frm (XtraForm)xtraTabControl1.SelectedTabPage.Controls[0];2.插件开发的底层标准最好是抽象类&#xff0c;这样扩展性好。…

linux运维工程师学习路线

一、学习路线&#xff1a; 1.青铜&#xff1a; 1、Linux基础知识、基本命令&#xff08;起源、组成、常用命令如cp、ls、file、mkdir等常见操作命令&#xff09; 2、Linux用户及权限基础 3、Linux系统进程管理进阶 4、linux高效文本、文件处理命令&#xff08;vim、grep、sed、…

React 全新文档上线!

大家好&#xff0c;我是若川&#xff0c;点此加我微信进源码群&#xff0c;一起学习源码。同时可以进群免费看明天的Vue专场直播&#xff0c;有尤雨溪分享「Vue3 生态现状以及展望」&#xff0c;还可以领取50场录播视频和PPT。React 官方文档改版耗时 1 年&#xff0c;今天已完…

POJ2392

题意:奶牛们要用K个不同类型的石头建太空电梯.每一种石头的高度为Hi&#xff0c;数量为Ci,且不能放在高于Ai的地方,求最高能建多高的太空电梯. 分析:多重背包,数组标记.显然将ai小的放在下面会更优.所以先排序. code: const maxh41000; var cnt:array[0..maxh] of longint;h,…

网络低俗词_从“低俗小说”中汲取7堂课,以创建有影响力的作品集

网络低俗词重点 (Top highlight)Design portfolios and blockbuster movies had become more and more generic. On the design side, I blame all the portfolio reviews and articles shared by “experienced” designers that repeat the same pieces of advice regardless…

Vue多个组件映射到同一个组件,页面不刷新?

问题 在做项目的过程中,有这么一个场景&#xff1a;多个组件通过配置路由,都跳转到同一个组件,他们之间的区别就是,传入的参数不同.请看router对象&#xff1a; userCenterLike: {name: user-center,params: {index: 0}},userCenterHistory: {name: user-center,params: {index…

尤雨溪写的100多行的“玩具 vite”,十分有助于理解 vite 原理

1. 前言大家好&#xff0c;我是若川。最近组织了源码共读活动&#xff0c;感兴趣的可以加我微信 ruochuan12想学源码&#xff0c;极力推荐之前我写的《学习源码整体架构系列》jQuery、underscore、lodash、vuex、sentry、axios、redux、koa、vue-devtools、vuex4、koa-compose、…

webflow如何使用_我如何使用Webflow构建辅助项目以帮助设计人员进行连接

webflow如何使用I launched Designer Slack Communities a while ago, aiming to help designers to connect with likeminded people. By sharing my website with the world, I’ve connected with so many designers. The whole experience is a first time for me, so I wa…

atmega8 例程:T1定时器 CTC模式 方波输出

/******************************************************************* * 函数库说明&#xff1a;ATMEGA8 T1定时器 CTC模式 方波输出 * 版本&#xff1a; v1.00 * 修改&#xff1a; 庞辉 芜湖联大飞思卡尔工作室…

antd的table进行列筛选时,更新dataSource,为什么table显示暂无数据?

我想当然地认为只要dataSource改变&#xff0c;那么<Table>组件就会重新渲染&#xff0c;但是有一种特殊情况例外&#xff1a;在onFilter()中不写筛选条件&#xff0c;在调用filterDropdown进行列筛选的时候&#xff0c;通过handleSearch改变/保存dataSource的状态&#…

重新构想原子化 CSS

感谢印记中文的 QC-L[1] 对本文进行翻译&#xff0c;英文原文: English Version[2]。本文会比往期文章相对长些。这是我个人的一个重大的工具发布&#xff0c;有许多内容我想谈论。如果你能花些时间读完&#xff0c;不胜感激&#xff0c;希望能对你有所帮助 :)推荐访问 https:/…

cv::mat 颜色空间_网站设计基础:负空间

cv::mat 颜色空间Let’s start off by answering this question: What is negative space? It is the “empty” space between and around the subjects of an image. In the context of web design, your “subjects” are the pictures, videos, text, buttons and other e…

MVC3 上传文件

前台引擎采用Razor 上传页View&#xff1a; model System.Web.HttpContextBase{ ViewBag.Title "上传文件";}<h2>上传文件</h2><br /><br />*new { enctype "multipart/form-data" }比不可少&#xff0c;否则上传文件不会成功…

Day07 - Ruby比一比:Symbol符号与String字串

前情提要&#xff1a; 第六天我们透过Ruby代码练习public&#xff0c;protected和privatemethod时&#xff0c;发现冒号在前面的参数&#xff0c;&#xff1a;mydraft&#xff0c;&#xff1a;myspace&#xff0c;这些就是符号Symbol。在今天&#xff0c;我们就来解释Symbol吧&…