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.pswp.cn/news/275315.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/275315.shtml
英文地址,請注明出處:http://en.pswp.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吧&…