BZOJ4573:[ZJOI2016]大森林——題解

http://www.lydsy.com/JudgeOnline/problem.php?id=4573

https://www.luogu.org/problemnew/show/P3348#sub

http://uoj.ac/problem/195

https://loj.ac/problem/2092

小Y家里有一個大森林,里面有n棵樹,編號從1到n。一開始這些樹都只是樹苗,只有一個節點,標號為1。這些樹都有一個特殊的節點,我們稱之為生長節點,這些節點有生長出子節點的能力。

小Y掌握了一種魔法,能讓第l棵樹到第r棵樹的生長節點長出一個子節點。同時她還能修改第l棵樹到第r棵樹的生長節點。她告訴了你她使用魔法的記錄,你能不能管理她家的森林,并且回答她的詢問呢?

參考:http://www.sigongzi.org/index.php/archives/LOJ2092.html

思路:

顯然我們不能對每棵樹LCT維護一下,而且我們對于這棵樹的形態還很嚴格。

那么我們把前一棵樹的形態轉換為后一棵樹的形態,這樣就只需要一棵樹了。

先考慮對于0操作,實際上我們可以記錄每個時刻每個節點在哪一段區間中(代碼的L和R就是干這個的),所以我們大可以對所有的樹都進行0操作。

對于1操作,和0操作類似,用L和R更新l和r后進行操作。

然后為了能夠快捷的更新樹,我們建立一個size為0的虛點(這樣對于路徑長度就不需要修改了),所有的生長操作都在上面進行,這樣我們刪除的時候cut這個點即可。

對于2操作,事實上兩個點一定存在的話,完全可以讓0和1操作全部排到它的前面。

實現:

先把所有操作存下來,然后以操作的樹為第一關鍵字,操作編號和順序為第二關鍵字排序。

(對于區間修改思考差分,畢竟我們都是對同一棵樹操作的。)

然后按樹編號從左到右進行操作,對于0和1操作先對虛點清空然后長即可。

查詢的時候就是用LCA求最短路的方法一樣。

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cctype>
#include<cstdio>
#include<vector>
#include<queue>
#include<cmath>
using namespace std;
const int N=4e5+5;
struct data{int pos,id,from,to;
}qry[N];
int n,m,fa[N],tr[N][2],val[N],size[N];
int cnt,tot,sum,aux,L[N],R[N],id[N],ans[N];
inline bool cmp(data a,data b){return a.pos<b.pos||(a.pos==b.pos&&a.id<b.id);
}
inline int read(){int X=0,w=0;char ch=0;while(!isdigit(ch)){w|=ch=='-';ch=getchar();}while(isdigit(ch))X=(X<<3)+(X<<1)+(ch^48),ch=getchar();return w?-X:X;
}
inline bool get(int x){return tr[fa[x]][1]==x;
}
inline bool isroot(int x){if(!fa[x])return 1;return tr[fa[x]][0]!=x&&tr[fa[x]][1]!=x;
}
inline void upt(int x){size[x]=val[x];if(tr[x][0])size[x]+=size[tr[x][0]];if(tr[x][1])size[x]+=size[tr[x][1]];
}
inline void rotate(int x){int y=fa[x],z=fa[y],b=tr[y][0]==x?tr[x][1]:tr[x][0];if(z&&!isroot(y))(tr[z][0]==y?tr[z][0]:tr[z][1])=x;fa[x]=z;fa[y]=x;b?fa[b]=y:0;if(tr[y][0]==x)tr[x][1]=y,tr[y][0]=b;else tr[x][0]=y,tr[y][1]=b;upt(y);upt(x);
}
inline void splay(int x){while(!isroot(x)){if(!isroot(fa[x]))rotate((get(x)==get(fa[x])?fa[x]:x));rotate(x);}upt(x);
}
inline int access(int x){int y;for(y=0;x;y=x,x=fa[x]){splay(x);tr[x][1]=y;if(y)fa[y]=x;}return y;
}
inline void link(int x,int y){splay(y);fa[x]=y;
}
inline void cut(int x){access(x);splay(x);if(tr[x][0])fa[tr[x][0]]=0;tr[x][0]=0;upt(x);
}
inline void makenode(int x){val[++sum]=x;size[sum]=x;
}
int main(){n=read(),m=read();cnt=1;L[cnt]=1,R[cnt]=n;id[cnt]=1;makenode(1);makenode(0);aux=sum;link(aux,id[1]);for(int i=1;i<=m;i++){int op=read();if(op==0){L[++cnt]=read(),R[cnt]=read();makenode(1);id[cnt]=sum;qry[++tot]=(data){1,i-m,sum,aux};}if(op==1){int l=read(),r=read(),x=read();l=max(l,L[x]);r=min(r,R[x]);if(l<=r){makenode(0);link(sum,aux);qry[++tot]=(data){l,i-m,sum,id[x]};qry[++tot]=(data){r+1,i-m,sum,aux};aux=sum;}}if(op==2){int l=read(),u=read(),v=read();qry[++tot]=(data){l,i,id[u],id[v]};}}memset(ans,-1,sizeof(ans));sort(qry+1,qry+tot+1,cmp);for(int i=1,p=1;i<=tot;p++){while(qry[i].pos==p){if(qry[i].id>0){ans[qry[i].id]=0;access(qry[i].from);splay(qry[i].from);ans[qry[i].id]+=size[qry[i].from];int lca=access(qry[i].to);splay(qry[i].to);ans[qry[i].id]+=size[qry[i].to];access(lca);splay(lca);ans[qry[i].id]-=size[lca]*2;}else{cut(qry[i].from);link(qry[i].from,qry[i].to);}i++;}}for(int i=1;i<=m;i++){if(ans[i]>=0)printf("%d\n",ans[i]);}return 0;
}

+++++++++++++++++++++++++++++++++++++++++++

?+本文作者:luyouqi233。               +

?+歡迎訪問我的博客:http://www.cnblogs.com/luyouqi233/+

+++++++++++++++++++++++++++++++++++++++++++

轉載于:https://www.cnblogs.com/luyouqi233/p/8483154.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/284049.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/284049.shtml
英文地址,請注明出處:http://en.pswp.cn/news/284049.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Spring中神奇@aotuWrited

好久沒有寫博客了&#xff0c;放假就是充電學習的時候&#xff0c;的確一直是這樣做的。來給自己一點掌聲。我們還是進入今天的主題吧。 我們自己寫代碼一般會向下面這樣干啊&#xff0c;因為這樣簡單&#xff0c;其余交給spring去做吧。Spring會自動把生成的userService注入進…

40個常用的springBoot注解

一、Spring Web MVC注解 RequestMapping RequestMapping注解的主要用途是將Web請求與請求處理類中的方法進行映射。 Spring MVC和Spring WebFlux都通過RquestMappingHandlerMapping和RequestMappingHndlerAdapter兩個類來提供對RequestMapping注解的支持。 RequestMapping注解…

.NET MAUI 跨平臺應用開發 I|.NET MAUI 跨平臺基礎

編輯&#xff1a;Alan Wang排版&#xff1a;Rani Sun微軟 Reactor 為幫助廣開發者&#xff0c;技術愛好者&#xff0c;更好的學習 .NET Core, C#, Python&#xff0c;數據科學&#xff0c;機器學習&#xff0c;AI&#xff0c;區塊鏈, IoT 等技術&#xff0c;將每周三到周六&…

走出宣傳,國產VR手機盒子到底哪家強?

國產VR手機盒子作為入門機是一個不錯的選擇&#xff0c;不過你知道哪一款更適合你嗎&#xff1f; 從去年看虛擬現實還是一個遙不可及的夢&#xff0c;今年卻真正的火起來了。各大廠商紛紛推出自家的VR設備&#xff0c;宣傳活動如火如荼。愛嘗鮮的你是否按耐不住? 如果你覺得動…

Shell 學習筆記之運算符

基本運算符 算術運算符 val expr 2 2 需要注意的是 表達式和運算符之間需要有空格&#xff08;比如2 2&#xff0c;不能是22&#xff09;兩邊最外面的字符是&#xff0c;在esc鍵下面&#xff0c;不是引號哦乘號* 前面必須加上反斜杠 \ 才能實現乘法效果&#xff0c;比如 exp…

POJ 2353 DP

雙向DP記錄路徑。 // by SiriusRen #include <stack> #include <cstdio> #include <cstring> using namespace std; stack<int>s; int n,m,RECL,RECR,minn0x3fffffff,a[555][555],f[555][555],recl[555][555],recr[555][555]; int main(){memset(f,0x3…

【ArcGIS Pro微課1000例】0024:自定義坐標系統---以阿爾伯斯投影(Albers)為例

在實際工作中,經常需要進行矢量數據或柵格數據的投影轉換工作,但有時候ArcGIS中恰恰沒有我們需要的坐標系,此時,就需要我們自定義坐標系。本文以阿爾伯斯投影(Albers)為例,講解自定義投影的一般過程及注意事項。 文章目錄 一、自定義坐標系二、投影轉換一、自定義坐標系…

Linux 操作必備 150 個命令

linux 命令是對 Linux 系統進行管理的命令。對于 Linux 系統來說&#xff0c;無論是中央處理器、內存、磁盤驅動器、鍵盤、鼠標&#xff0c;還是用戶等都是文件&#xff0c; Linux 系統管理的命令是它正常運行的核心&#xff0c;與之前的 DOS 命令類似。 linux 命令在系統中有兩…

dotnet 6 為什么網絡請求不跟隨系統網絡代理變化而動態切換代理

本文記錄在 dotnet 6 的網絡和在 .NET Framework 的行為的變更。在 dotnet 6 下&#xff0c;默認的網絡請求在系統網絡代理變更的時候&#xff0c;是不會動態切換代理的。例如在應用運行進行網絡通訊之后&#xff0c;打開 Fiddler 抓包&#xff0c;此時將會發現 Fiddler 抓不到…

舊金山參議員提議發布“封殺令”,理由是馬路不為機器人所服務

說實話&#xff0c;這個理由有夠奇葩。 因為快遞無人機所受限制頗多&#xff0c;漸漸地&#xff0c;越來越多的快遞機器人被研制出來&#xff08;這里的“機器人”&#xff0c;包括無人車和及機器人&#xff09;&#xff0c;用于城市的快遞發送&#xff0c;比如國內的京東無人…

Socket編程:之雙機通信

服務端&#xff1a; 1 #include<sys/socket.h>2 #include<sys/types.h>3 #include<stdio.h>4 #include<unistd.h>5 #include<stdlib.h>6 #include<string.h>7 #include<netdb.h>8 #include<netinet/in.h>9 #include<arpa/i…

jquery中$each()

$.each()&#xff1a;可用于遍歷任何的集合(無論是數組或對象) $(selector).each()&#xff1a;專用于jquery對象的遍歷, 如果是數組,回調函數每次傳入數組的索引和對應的值(值亦可以通過this 關鍵字獲取,但javascript總會包裝this 值作為一個對象—盡管是一個字符串或是一個數…

【QGIS入門實戰精品教程】7.2:QGIS點狀數據符號化設置案例教程

點狀符號化的類型有:單一符號、分類、漸進、基于規則、點的位移、點聚類、熱圖。 相關閱讀: 【QGIS入門實戰精品教程】7.1:QGIS面狀數據符號化設置案例教程 文章目錄 一、單一符號二、分類三、漸進四、基于規則五、點的位移六、點聚類七、熱圖一、單一符號 跟面狀符號一樣,…

SpringCloud與Dubbo的比較

Dubbo 一、dubbo簡介 Dubbo是阿里巴巴公司開源的一個高性能優秀的服務框架&#xff0c;使得應用可通過高性能的RPC實現服務的輸出和輸入功能&#xff0c;可以和Spring框架無縫集成。 Dubbo是一款高性能、輕量級的開源Java RPC框架&#xff0c;它提供了三大核心能力&#xff…

VR 技術加上 8K 畫質! 2016 年里約奧運會亮點十足

據報道&#xff0c;2016 年里約奧運會將運用到 VR 技術。 最近&#xff0c;奧林匹克廣播服務公司&#xff08;OBS&#xff09;表示出對虛擬現實技術的興趣&#xff0c;其實用虛擬現實技術報道賽事已經不是什么新鮮的事了&#xff0c;之前 NBA 就這樣做過&#xff0c;但是將奧運…

POJ 1986 Distance Queries(LCA)

【題目鏈接】 http://poj.org/problem?id1986 【題目大意】 給出一棵樹&#xff0c;問任意兩點間距離。 【題解】 u,v之間距離為dis[u]dis[v]-2*dis[LCA(u,v)] 【代碼】 #include <cstdio> #include <algorithm> #include <cstring> using namespace std; c…

WPF 實現柱形統計圖

WPF 實現柱形統計圖WPF 實現柱形統計圖作者&#xff1a;WPFDevelopersOrg原文鏈接&#xff1a; https://github.com/WPFDevelopersOrg/WPFDevelopers框架使用大于等于.NET40&#xff1b;Visual Studio 2022;項目使用 MIT 開源許可協議&#xff1b;避免畫線發虛DrawingContext…

Win11卸載WSL,卸載Windows子系統

雖然 Linux 發行版可以通過 Microsoft Store 安裝&#xff0c;但不能通過 Microsoft Store 卸載。 可以通過下列命令卸載。 1、查看當前環境安裝的wsl wsl --list2、注銷&#xff08;卸載&#xff09;當前安裝的Linux的Windows子系統 wsl --unregister Ubuntu3、卸載成功&#…

100億人口會挨餓嗎?人工智能迎擊全球糧食問題

給作物看病的AI、走路“長眼”的拖拉機、上帝視角的衛星數據分析——未來吃飯就靠它們了。 圖片來源&#xff1a;Blue River Technology 人類又面臨了一項危機——隨著人口不斷膨脹&#xff0c;到2050年人類總人口也許要達到100億&#xff0c;然而&#xff0c;地球卻沒有等比例…

Python學習總結15:時間模塊datetime time calendar (二)

二 、datetime模塊 1. datetime中常量 1&#xff09;datetime.MINYEAR&#xff0c;表示datetime所能表示的最小年份&#xff0c;MINYEAR 1。 2&#xff09;datetime.MAXYEAR&#xff0c;表示datetime所能表示的最大年份&#xff0c;MAXYEAR 9999。 2. datetime中的常見類 da…