洛谷 4115 Qtree4——鏈分治

題目:https://www.luogu.org/problemnew/show/P4115

論文:https://wenku.baidu.com/view/1bc2e4ea172ded630b1cb602.html

重鏈剖分,分別用線段樹維護每條重鏈。線段樹葉子的信息是該點輕孩子的信息;線段樹區間的信息是考慮重鏈的一個區間以及附帶的輕孩子們的信息。

修改一個點,改它所在的重鏈的信息。祖先的每條重鏈都有一個點的 “輕孩子信息” 改變了,改一下那個位置的值,更新它的線段樹,再用該重鏈的信息作為輕孩子更新更上面的重鏈。

本題每個點要維護的是 “向下以白點為端點的最長鏈” 和 “向下以白點為端點的次長鏈” 。用可刪堆維護。

線段樹區間維護 “從左邊開始、以白點結束的最長鏈” 、 “從右邊開始、以白點結束的最長鏈” 、 “中間一條兩端點都是白點的最長鏈” 。前兩個信息是為了更新第三個信息。

每條重鏈的答案放進全局可刪堆中。

注意求 “次長鏈” 的時候,自己是先把堆頂拿出來,再看剩下的堆的堆頂。要注意再看之前先用刪除堆更新一下!

預處理的時候,自己想一個一個插入。在 pshp 的時候要用到兄弟的 fl , fr , pr , sc 等信息。所以得先把線段樹整個建出來,不能有些孩子是空的就開始 pshp 。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#define ls Ls[cr]
#define rs Rs[cr]
using namespace std;
int rdn()
{int ret=0;bool fx=1;char ch=getchar();while(ch>'9'||ch<'0'){if(ch=='-')fx=0;ch=getchar();}while(ch>='0'&&ch<='9')ret=ret*10+ch-'0',ch=getchar();return fx?ret:-ret;
}
int Mx(int a,int b){return a>b?a:b;}
int Mn(int a,int b){return a<b?a:b;}
const int N=1e5+5,M=2e5+5,INF=1e9,Lm=-1e8;
int n,hd[N],xnt,to[M],nxt[M],w[M]; bool col[N];
int siz[N],son[M],dep[N],fa[N],fw[N],top[N];
int dis[N],dp2[N],lm[N],tot,rt[N],Ls[M],Rs[M];
int dy[N],fl[M],fr[M],mx[M],pr[M],sc[M];
priority_queue<int> q[N],dq[N],ans,dans;
int Dis(int x,int y){return dp2[y]-dp2[x];}
void frs(int x)
{while(dq[x].size()&&q[x].top()==dq[x].top())q[x].pop(), dq[x].pop();
}
void pshp(int cr)
{pr[cr]=pr[ls]; sc[cr]=sc[rs];fl[cr]=Mx(fl[ls],Dis(pr[cr],pr[rs])+fl[rs]);fr[cr]=Mx(fr[rs],Dis(sc[ls],sc[cr])+fr[ls]);mx[cr]=Mx(Dis(sc[ls],pr[rs])+fr[ls]+fl[rs],Mx(mx[ls],mx[rs]));
}
void build(int l,int r,int &cr)
{cr=++tot;fl[cr]=fr[cr]=mx[cr]=-INF;pr[cr]=dy[l]; sc[cr]=dy[r];if(l==r)return; int mid=l+r>>1;build(l,mid,ls); build(mid+1,r,rs);
}
void updt(int l,int r,int cr,int p,int k)
{if(l==r){fl[cr]=fr[cr]=dis[k]; pr[cr]=sc[cr]=k;if(!q[k].size()){ mx[cr]=-INF; return;}q[k].pop(); frs(k);//
      int d2=-INF;if(q[k].size())d2=q[k].top();if(!col[k])mx[cr]=Mx(dis[k]+d2,Mx(dis[k],d2));//col[k] not col[cr]!!else mx[cr]=dis[k]+d2;q[k].push(dis[k]);return;}int mid=l+r>>1;if(p<=mid)updt(l,mid,ls,p,k); else updt(mid+1,r,rs,p,k);pshp(cr);
}
void add(int x,int y,int z)
{to[++xnt]=y;nxt[xnt]=hd[x];hd[x]=xnt;w[xnt]=z;}
void dfs(int cr,int f)
{dep[cr]=dep[f]+1; dp2[cr]=dp2[f]+fw[cr];fa[cr]=f; siz[cr]=1;for(int i=hd[cr],v;i;i=nxt[i])if((v=to[i])!=f){fw[v]=w[i]; dfs(v,cr); siz[cr]+=siz[v];if(siz[v]>siz[son[cr]])son[cr]=v;}
}
int Ps(int cr){return dep[cr]-dep[top[cr]]+1;}
void dfsx(int cr,int f)
{if(son[cr])top[son[cr]]=top[cr],dfsx(son[cr],cr);for(int i=hd[cr],v;i;i=nxt[i])if((v=to[i])!=f&&v!=son[cr]){top[v]=v;dfsx(v,cr);if(fl[rt[v]]>Lm)q[cr].push(fl[rt[v]]+w[i]);}if(!col[cr])q[cr].push(0);if(q[cr].size())dis[cr]=q[cr].top(); else dis[cr]=-INF;int p=Ps(cr),tp=top[cr];if(p>lm[tp]){lm[tp]=p;for(int i=p,k=cr;i;i--,k=fa[k])dy[i]=k;build(1,p,rt[tp]);}updt(1,lm[tp],rt[tp],p,cr);if(tp==cr)ans.push(mx[rt[cr]]);
}
void chg(int cr)
{col[cr]=!col[cr];if(!col[cr])q[cr].push(0); else dq[cr].push(0);int x=top[cr]; frs(cr);if(q[cr].size())dis[cr]=q[cr].top(); else dis[cr]=-INF;dans.push(mx[rt[x]]);if(fa[x])dq[fa[x]].push(fl[rt[x]]+fw[x]);updt(1,lm[x],rt[x],Ps(cr),cr);ans.push(mx[rt[x]]);if(fa[x])q[fa[x]].push(fl[rt[x]]+fw[x]);while(fa[x]){cr=fa[x]; x=top[cr]; frs(cr);if(q[cr].size())dis[cr]=q[cr].top(); else dis[cr]=-INF;dans.push(mx[rt[x]]);if(fa[x])dq[fa[x]].push(fl[rt[x]]+fw[x]);updt(1,lm[x],rt[x],Ps(cr),cr);ans.push(mx[rt[x]]);if(fa[x])q[fa[x]].push(fl[rt[x]]+fw[x]);}
}
int main()
{n=rdn();for(int i=1,u,v,z;i<n;i++){u=rdn();v=rdn();z=rdn();add(u,v,z);add(v,u,z);}dfs(1,0); top[1]=1; dfsx(1,0);int Q=rdn(); char ch;int x;while(Q--){cin>>ch;if(ch=='A'){while(dans.size()&&ans.top()==dans.top())ans.pop(),dans.pop();if(ans.top()<Lm)puts("They have disappeared.");else printf("%d\n",ans.top());}else{ x=rdn(); chg(x);}}return 0;
}

?

轉載于:https://www.cnblogs.com/Narh/p/10776851.html

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

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

相關文章

每次啟動項目的服務,電腦竟然乖乖的幫我打開了瀏覽器,100行源碼揭秘!

1. 前言大家好&#xff0c;我是若川。最近組織了源碼共讀活動&#xff0c;感興趣的可以加我微信 ruochuan12 參與&#xff0c;已進行三個月了&#xff0c;大家一起交流學習&#xff0c;共同進步。想學源碼&#xff0c;極力推薦之前我寫的《學習源碼整體架構系列》 包含jQuery、…

初級爬蟲師_初級設計師的4條視覺原則

初級爬蟲師重點 (Top highlight)Like many UXers, I got into the industry from a non-visual background (in my case it was Business and later on Human Cognition). Even though I found great benefits coming from those backgrounds, it also meant I had no UI/Visua…

String類中IndexOf與SubString

IndexOfpublic: int IndexOf( String^ value, int startIndex, int count ) 說明&#xff1a; value類型&#xff1a;System..::.String要查找的 String。 startIndex類型&#xff1a;System..::.Int32搜索起始位置。 count類型&#xff1a;System..::.Int32要檢查的字符位置…

開源監控解決方案OpenFalcon系列(一)

OpenFalcon是由小米的運維團隊開源的一款企業級、高可用、可擴展的開源監控解決方案&#xff0c;&#xff0c;在眾多開源愛好者的支持下&#xff0c;功能越來越豐富&#xff0c;文檔更加的完善&#xff0c;OpenFalcon 已經成為國內最流行的監控系統之一。小米、美團、金山云、快…

如何利用 webpack 在項目中做出亮點

大家好&#xff0c;我是若川。最近這幾年&#xff0c;在前端代碼打包器領域內&#xff0c;webpack 算得上是時下最流行的前端打包工具。它可以分析各個模塊的依賴關系&#xff0c;最終打包成我們常見的靜態文件&#xff1a;.js 、 .css 、 .jpg 、.png&#xff0c;極大地提升了…

[轉]上下拉電阻

上下拉電阻有什么用&#xff1f; 對這個問題&#xff0c;平時沒有留意過&#xff0c;搞設計的時候都是照本宣科&#xff0c;沒有真正弄懂意思&#xff0e; 很多單片機開發的入門者&#xff0c;以及一些從事軟件開發的人&#xff0c;往往在開發單片機的時候遇到上拉電阻、下拉…

yum安裝Mariadb,二進制安裝Mariadb

yum安裝Mariadb 設置Mariadb的yum源 vim /etc/yum.repos.d/mariadb.repo [mariadb] namemariadb baseurlhttps://mirrors.tuna.tsinghua.edu.cn/mariadb/yum/10.2/centos7-amd64/ gpgcheck0 使用清華yum源安裝Mariadb,可以選擇不同的版本&#xff0c;此處安裝10.2.23 yum in…

Oracle中的wmsys.wm_concat

Oracle中的wmsys.wm_concat主要實現行轉列功能(說白了就是將查詢的某一列值使用逗號進行隔開拼接&#xff0c;成為一條數據)。 wmsys.wm_concat除了單獨使用外還可以和over函數結合使用。 開始看看具體使用方法&#xff1a; select t.rank, t.Name from t_menu_item t; rank…

Github 王炸功能!Copilot 替代打工人編程?

大家好&#xff0c;我是若川。最近組織了源碼共讀活動&#xff0c;感興趣的可以加我微信 ruochuan12 參與&#xff0c;已進行三個月了&#xff0c;大家一起交流學習&#xff0c;共同進步。大家好&#xff0c;我是皮湯。最近組里在討論一個有意思的工具 Github Copilot&#xff…

ux和ui_糟糕的UI與UX番茄醬模因

ux和uiAt face value, this meme appears to be a quick and easy tool for educating the general public about what the differences are between UI and UX. You might look at the attractive glass bottle labeled “UI” and understand that UI might have to do more …

Linux中的wheel用戶組是什么?

在Linux中wheel組就類似于一個管理員的組。 通常在Linux下&#xff0c;即使我們有系統管理員root的權限&#xff0c;也不推薦用root用戶登錄。一般情況下用普通用戶登錄就可以了&#xff0c;在需要root權限執行一些操作時&#xff0c;再su登錄成為root用戶。但是&#xff0c;任…

ElementUI 組件庫 md-loader 的解析和優化

大家好&#xff0c;我是若川。最近組織了源碼共讀活動&#xff0c;感興趣的可以加我微信 ruochuan12 參與&#xff0c;已進行三個月了&#xff0c;大家一起交流學習&#xff0c;共同進步。背景相信很多同學在學習 webpack 的時候&#xff0c;對 loader 的概念應該有所了解&…

一個html5流星雨源碼

流星會隨著鼠標的方向劃過&#xff0c;按緊鼠標左鍵可以增長流星的尾巴。 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> <html lang"zh-CN"> <head> <title>流星雨<…

csdn 用戶 螞蟻翹大象_用戶界面設計師房間里的大象

csdn 用戶 螞蟻翹大象Once upon a time, an educated eye detected a new trend in UI designs, particularly, in Dribbble. It was a conceptual proposition, not an actual design for a customer or an app. Trying to explain the characteristics of this new trend, a …

面試官問發布訂閱模式是在問什么?

大家好&#xff0c;我是若川。最近組織了源碼共讀活動&#xff0c;感興趣的可以加我微信 ruochuan12 參與&#xff0c;已進行了三個多月&#xff0c;大家一起交流學習&#xff0c;共同進步。本文來自 simonezhou 小姐姐投稿的第八期筆記。面試官常問發布訂閱、觀察者模式&#…

linux服務器內存、根目錄使用率、某進程的監控告警腳本

腳本內容如下 #!/bin/bash#磁盤超過百分之80發送郵件告警DISK_USEDdf -T |sed -n "2p" |awk {print ($4/$3)*100}DISK_percentage80if [ expr "$DISK_USED > $DISK_percentage" ]thenecho "$HOSTNAME服務器當前硬盤使用率為$DISK_USED%" | ma…

figma下載_不用擔心Figma中的間距

figma下載重點 (Top highlight)I spend way too much time caring about spacing when designing interfaces and building design systems. You are probably no stranger to the constant 1 px and 8 px nudging, continuous checking of the bottom or in-between space for…

【建議收藏】面試官賊喜歡問的 32+ vue 修飾符,你掌握幾種啦?

大家好&#xff0c;我是若川。最近組織了源碼共讀活動&#xff0c;感興趣的可以加我微信 ruochuan12 參與&#xff0c;已進行了三個多月&#xff0c;大家一起交流學習&#xff0c;共同進步。前言vue簡潔好用體現在很多個地方&#xff0c;比如其內置了32修飾符&#xff0c;可以很…

知識管理系統Data Solution研發日記之一 場景設計與需求列出

在平時開發的過程中&#xff0c;經常會查找一些資料&#xff0c;從網上下載一些網頁&#xff0c;壓縮格式文件到自己的電腦中&#xff0c;然后閱讀。程序有別于其他行業的一個特征是&#xff0c;所有的資料&#xff0c;數據&#xff0c;壓縮文件&#xff0c;只用于產生可以工作…

系列TCP/IP協議-動態IP選路協議(008)

一、引言 前一章已經說過了IP數據包是如何分發的。為啥這一章還要說這個問題&#xff1f;在網絡很小、只有單個連接點、沒有多余的路由的時候&#xff0c;使用靜態選路是可以的。但是一旦網絡變大一點就會出現各種問題。在大網絡中的網絡選路將在該節說明。 ??動態選路協議用…