【動態維護樹的直徑】【HBCPC2023】I. Colorful Tree

題目

在這里插入圖片描述
https://codeforces.com/gym/105139/problem/I

思路

其實相當于是分別求黑色點和白色點所構成的樹的直徑。
當兩個連通塊連在了一起,假設它們的直徑是 ( u 1 , v 1 ) , ( u 2 , v 2 ) (u_1,v_1),(u_2,v_2) (u1?,v1?)(u2?,v2?),那么新連通塊的直徑一定是 ( u 1 , v 1 ) , ( u 2 , v 2 ) , ( v 1 , u 2 ) , ( v 1 , v 2 ) , ( u 1 , u 2 ) , ( u 1 , v 2 ) (u_1,v_1),(u_2,v_2),(v_1,u_2),(v_1,v_2),(u_1,u_2),(u_1,v_2) (u1?,v1?)(u2?,v2?)(v1?,u2?)(v1?,v2?)(u1?,u2?)(u1?,v2?) 中的一條。
由于題目要給鏈染色,所以只能樹剖+線段樹維護。
白色的點倒過來求一遍即可。

代碼

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e6+7;
vector<int> dep,fa,ans,siz,top,mxs,dfn,f,id,tr,tag,ti;
vector<array<int,3>> d;
int n,q,inf,tot;
vector<array<int,2>> Q;
vector<vector<int>> e,p;
int gf(int x)
{return x==fa[x]?x:fa[x]=gf(fa[x]);
}
void dfs1(int u,int fa)
{siz[u]=1;dep[u]=dep[fa]+1;f[u]=fa;for(auto v:e[u]){if(v==fa) continue;dfs1(v,u);siz[u]+=siz[v];if(siz[v]>siz[mxs[u]])mxs[u]=v;}
}
void dfs2(int u,int topf)
{dfn[u]=++tot; id[tot]=u;top[u]=topf;if(!mxs[u]) return;dfs2(mxs[u],topf);for(auto v:e[u]){if(v==f[u]||v==mxs[u]) continue;dfs2(v,v);}
}
int lca(int x,int y)
{while(top[x]!=top[y]){if(dep[top[x]]<dep[top[y]]) swap(x,y);x=f[top[x]];}if(dep[x]<dep[y]) swap(x,y); return y;
}
int getdis(int u,int v)
{int l=lca(u,v);return dep[u]+dep[v]-2*dep[l]+1;
}
void pushdown(int u)
{if(!tag[u]) return;tag[u<<1]=tag[u<<1|1]=tag[u];tr[u<<1]=tr[u<<1|1]=tag[u];tag[u]=0;
}
void build(int u,int st,int ed)
{if(st==ed){tr[u]=inf;return;}int mid=st+ed>>1;build(u<<1,st,mid); build(u<<1|1,mid+1,ed);
}
void change(int u,int st,int ed,int l,int r,int t)
{if(l<=st&&ed<=r){tag[u]=t;tr[u]=t;return;}pushdown(u);int mid=st+ed>>1;if(mid>=l) change(u<<1,st,mid,l,r,t);if(mid<r) change(u<<1|1,mid+1,ed,l,r,t);
}
int query(int u,int st,int ed,int x)
{if(st==ed&&ed==x){return tr[u];}pushdown(u);int mid=st+ed>>1;if(mid>=x) return query(u<<1,st,mid,x);else return query(u<<1|1,mid+1,ed,x);
}
void dye(int x,int y,int c)
{while(top[x]!=top[y]){if(dep[top[x]]<dep[top[y]]) swap(x,y);change(1,1,n,dfn[top[x]],dfn[x],c);x=f[top[x]];}if(dep[x]<dep[y]) swap(x,y); change(1,1,n,dfn[y],dfn[x],c);
}
int merge(int u,int v)
{int x=gf(u),y=gf(v);if(x==y) return 0;auto [u1,v1,d1]=d[x];auto [u2,v2,d2]=d[y];int ur=u1,vr=v1,dr=d1;if(d2>d1){ur=u2; vr=v2; dr=d2;}u=u1; v=u2; int di=getdis(u,v);if(di>dr){ur=u; vr=v; dr=di;}u=u1; v=v2; di=getdis(u,v);if(di>dr){ur=u; vr=v; dr=di;}u=v1; v=u2; di=getdis(u,v);if(di>dr){ur=u; vr=v; dr=di;}u=v1; v=v2; di=getdis(u,v);if(di>dr){ur=u; vr=v; dr=di;}d[x]={ur,vr,dr};fa[y]=x;return dr;
}
void init(int n,int q)
{tot=0;dep.clear(); dep.resize(n+1);fa.clear(); fa.resize(n+1);f.clear(); f.resize(n+1);id.clear(); id.resize(n+1);tr.clear(); tr.resize(n<<2|1);tag.clear(); tag.resize(n<<2|1);for(int i=1; i<=n; i++) fa[i]=i;e.clear(); e.resize(n+1);p.clear(); p.resize(q+2);ti.clear(); ti.resize(n+1);siz.clear(); siz.resize(n+1);top.clear(); top.resize(n+1);mxs.clear(); mxs.resize(n+1);dfn.clear(); dfn.resize(n+1);ans.clear(); ans.resize(q+1);Q.clear(); Q.resize(q+1);
}
void O_o()
{cin>>n>>q;inf=q+1;init(n,q);for(int i=1; i<n; i++){int x,y;cin>>x>>y;e[x].push_back(y);e[y].push_back(x);}dfs1(1,0);dfs2(1,1);build(1,1,n);d.resize(n+1);for(int i=1; i<=n; i++)d[i]={i,i,1};for(int i=1; i<=q; i++){int u,v;cin>>u>>v;Q[i]={u,v};}for(int i=q; i>=1; i--){auto [u,v]=Q[i];dye(u,v,i);}for(int i=1; i<=n; i++){int t=query(1,1,n,dfn[i]);ti[i]=t;p[t].push_back(i);}//solveint mx=1;for(int i=1; i<=q; i++){for(auto u:p[i]){for(auto v:e[u]){if(ti[v]>i) continue;int ass=merge(u,v);mx=max(mx,ass);
//				cerr<<ass<<"**\n\n";}}ans[i]=max(ans[i],mx);}mx=1;for(int i=1; i<=n; i++)d[i]={i,i,1};for(int i=1; i<=n; i++) fa[i]=i;for(int i=q+1; i>=2; i--){for(auto u:p[i]){for(auto v:e[u]){if(ti[v]<i) continue;int ass=merge(u,v);mx=max(mx,ass);
//				cerr<<ass<<"**\n\n";}}ans[i-1]=max(ans[i-1],mx);}for(int i=1; i<=q; i++){cout<<ans[i]<<"\n";}
}
signed main()
{ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);cout<<fixed<<setprecision(2);int T=1;cin>>T;while(T--){O_o();}
}

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

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

相關文章

【程序填空】三維點坐標平移(增量運算符重載)

題目描述 定義一個三維點Point類&#xff0c;利用友元函數重載""和"--"運算符&#xff0c;并區分這兩種運算符的前置和后置運算。 表示x\y\z坐標都1&#xff0c;--表示x\y\z坐標都-1 請完成以下程序填空 輸入 只有一行輸入&#xff0c;輸入三個整數&a…

Linux運維工程師基礎面試題整理(二)

Linux運維工程師基礎面試題整理(二) 1. 如何配置Linux網絡?請說出3種以上方法?2. 如何查詢某個目錄下的每個文件大小?3. 如何診斷ping不通服務器?4.在Linux中,如何讓一個命令在后臺運行?5. 如何查看Linux系統日志?6. 如何查看磁盤空間情況?7. 如何在Linux中查看和管理…

一個開源的工具類輪子是怎么造出來的

心路歷程 為什么要做 在22年9月的某一天&#xff0c;在公司開需求評審時&#xff0c;接到了一個給PDF、圖片添加水印的需求。做為一個剛工作的CURD程序員&#xff0c;在遇到這些問題時&#xff0c;第一反應是去github上找找有沒有類似的開源框架。但是&#xff0c;出乎我意料…

2024年 電工杯 (B題)大學生數學建模挑戰賽 | 大學生平衡膳食食譜的優化設計 | 數學建模完整代碼解析

DeepVisionary 每日深度學習前沿科技推送&頂會論文&數學建模與科技信息前沿資訊分享&#xff0c;與你一起了解前沿科技知識&#xff01; 本次DeepVisionary帶來的是電工杯的詳細解讀&#xff1a; 完整內容可以在文章末尾全文免費領取&閱讀&#xff01; 問題1&…

快手二面準備【面試準備】

快手二面準備【面試準備】 前言版權快手二面準備秋招一面中的問題實習一面中的問題計算機網絡和操作系統論壇項目登錄注冊ThreadLocal代替session存儲用戶秒殺項目登錄注冊->阿里驗證碼->rpcsession為什么改為token實現&#xff0c;redis存儲用戶信息由binlog的用法->…

Python魔法學院:PySpider篇——網絡世界的探險與征服

Hi&#xff0c;我是阿佑&#xff0c;迎來到Python魔法學院&#xff0c;今天阿佑要帶大家學習的是PySpider篇——一門讓你在網絡世界中探險與征服的魔法課程。從環境搭建到高級功能應用&#xff0c;再到性能優化&#xff0c;每一個章節都是成為數據大師的必經之路&#xff01; 文…

為什么拼命賺錢:窮怕了

我內心深處比較自卑。 從小在農村長大&#xff0c;爸不管媽不愛。 這么說大家沒感覺&#xff0c;從小什么都干&#xff0c;六歲開始做飯&#xff0c;每次開學都會全員大掃除&#xff0c;站在那里腳踩泥土地、眼神呆滯、雙手無處安放、眼神都不敢直視的小伙子就是我&#xff0…

VS Code中使用 Anaconda 環境

在 Visual Studio Code (VS Code) 中使用 Anaconda 環境進行 Python 開發&#xff0c;可以充分利用 Anaconda 提供的包管理和虛擬環境功能&#xff0c;同時享受 VS Code 提供的強大開發工具和調試功能。以下是詳細步驟&#xff1a; 1. 安裝 Visual Studio Code 和 Anaconda 首…

JavaScript Window對象

一、BOM&#xff08;瀏覽器對象模型&#xff09; window對象是一個全局對象&#xff0c;也可以說是JavaScript中的頂級對象。 像document、alert()、console.log()這些都是window的屬性&#xff0c;基本BOM的屬性和方法都是window的。 所有通過var定義在全局作用域中的變量、…

GitLab的原理及應用詳解(四)

本系列文章簡介&#xff1a; 隨著軟件開發的不斷進步和發展&#xff0c;版本控制系統成為了現代軟件開發過程中不可或缺的一部分。而GitLab作為其中一種流行的版本控制工具&#xff0c;在軟件開發領域享有廣泛的應用。GitLab不僅提供了強大的版本控制功能&#xff0c;還集成了項…

四川古力科技抖音小店,創新科技點亮購物新體驗

在這個數字化浪潮洶涌的時代&#xff0c;四川古力科技以其前瞻性的戰略眼光和創新能力&#xff0c;閃耀于抖音小店這片電商新藍海&#xff0c;開啟了未來購物的新紀元。作為一家集技術研發、產品創新、市場營銷于一體的科技型企業&#xff0c;古力科技不僅為消費者帶來了前所未…

idea中顯示git的Local Changes

1. 第一打開idea中的Settings文件 2. 找到Version Contro中的commint 3. 取消勾選應用即可 4. 本地提交就會顯示出來

ruoyi出現的那些bug

1、 npm install --registryhttps://registry.npm.taobao.org/element-ui request to https://registry.npm.taobao.org/element-ui failed, reason: certificate has expired 路徑錯誤 ? npm install https://registry.npmmirror.com 2、自定義模塊401 {"msg"…

Google Earth Engine(GEE)深度學習入門教程-Python數據讀入篇

Python數據讀入篇 前置條件&#xff1a; GEE預處理影像導出保存為tfrecord的數據包&#xff0c;并下載到本地tensorflow的深度學習環境 本篇文章的目的主要是把Tfrecord格式的數據加載為tf可使用的數據集格式 設定超參數 首先需要設定導出時的波段名稱和數據格式&#xff…

Java日期時間差計算-Hutool 多少天多少時多少分多少秒

在Java中&#xff0c;使用Hutool庫來計算兩個日期之間具體相差的天數、小時數、分鐘數和秒數&#xff0c;可以通過一系列步驟實現。這里提供一個示例代碼&#xff0c;演示如何完成這個需求&#xff1a; 首先&#xff0c;確保你的項目中已添加Hutool依賴&#xff0c;如之前所述…

ARTS Week 30

Algorithm 本周的算法題為 747. 至少是其他數字兩倍的最大數 給你一個整數數組 nums &#xff0c;其中總是存在 唯一的 一個最大整數 。 請你找出數組中的最大元素并檢查它是否 至少是數組中每個其他數字的兩倍 。如果是&#xff0c;則返回 最大元素的下標 &#xff0c;否則返回…

SpringBoot集成Logback將日志寫入文件夾

一、logback簡介&#xff1a; 目前比較常用的ava日志框架:Logback、log4j、log4j2、JUL等等。 Logback是在log4j的基礎上重新開發的一套日志框架&#xff0c;是完全實現SLF4J接口API(也叫日志門面)。 Logback 的架構非常通用&#xff0c;可以應用于不同的環境。目前logback分為…

LeetCode題練習與總結:從前序與中序遍歷序列構造二叉樹--105

一、題目描述 給定兩個整數數組 preorder 和 inorder &#xff0c;其中 preorder 是二叉樹的先序遍歷&#xff0c; inorder 是同一棵樹的中序遍歷&#xff0c;請構造二叉樹并返回其根節點。 示例 1: 輸入: preorder [3,9,20,15,7], inorder [9,3,15,20,7] 輸出: [3,9,20,nul…

什么是經典藍牙模塊?

什么是經典藍牙模塊&#xff1f;   前面我們已經就藍牙模塊的概念做了了解&#xff0c;隨著時間的推移&#xff0c;產品越來越智能&#xff0c;需要的藍牙模塊也就越來越廣泛&#xff0c;本篇文章我們就一起了解下什么是經典藍牙模塊。   經典藍牙模塊(BT)泛指支持藍牙協議…

SwiftUI中的手勢(DragGesture拖拽手勢及Drag動畫組件)

上一篇文章我們了解了如何使用.gesture修飾符和GestureState屬性包裝器&#xff0c;讓我們看看另一種常見的手勢&#xff1a;DragGesture拖拽手勢。 下面先看個效果圖&#xff1a; 這個效果中&#xff0c;我們實現了一個Text文本&#xff0c;并添加了拖拽手勢&#xff0c;可以…