洛谷P5021 [NOIP 2018 提高組] 賽道修建【題解】【二分答案+樹上貪心】

P5021 [NOIP 2018 提高組] 賽道修建

題意簡述

給定一棵含 n n n 個點的無向帶權樹,求將其分裂為 m m m 條鏈后,最短的一條鏈的最大長度是多少?

點可以重復使用,邊不可以重復使用。

思路

二分答案貪心判定貌似可以?

看一下數據規模。

a i = 1 a_i = 1 ai?=1 ,菊花圖。鏈最多含兩條邊。

b i = a i + 1 b_i = a_i + 1 bi?=ai?+1 ,整棵樹是一條鏈。

分支不超過 3 3 3 ?感覺在有意引導。是二叉樹。

菊花圖是最有用的,考慮菊花圖時如何求解。設當前二分出的賽道長度為 m i d mid mid

顯然此時一條鏈最多含兩條邊,考慮按邊權排序:

1**.已經大于 m i d mid mid 的邊**不必再拼接其他邊,因為它已經能產生貢獻了,再與其他邊拼接,自身貢獻不變的同時,阻止了其他邊產生貢獻的可能,必然不優。

2.剩下的邊里,從小到大,對于每個邊 x x x二分(減小查詢復雜度)查詢出與它拼接能產生長度大于 m i d mid mid最短的一條邊,即找到最小的 y y y ,滿足 x + y ≥ m i d x + y \ge mid x+ymid

為什么?如果用更長的邊( > y > y >y ),那么可能會使得原本可以產生貢獻的 y y y 被拋棄,又因為自身不夠長而無法再次與別的邊產生貢獻,相反,被使用的更長邊顯然更有可能與別的邊拼接產生貢獻,因此選擇最小的 y y y 即可。

菊花圖的情況已經可以求解。不妨把每一個子樹視作上述菊花圖的情況,現在子樹內已經得到最優解,如何向父節點擴展?

由于每個結點到父節點的邊是唯一的,那么只能選擇一條邊傳遞給父節點,供后續產生貢獻,那么,不難想到傳遞 剩余未匹配邊最長的一條。因為最長,后續產生貢獻的概率越大,緩解了父節點的匹配壓力,保證了全局最優解。可以用 d p [ u ] dp[u] dp[u] 表示當前結點最長未匹配邊,到父節點出只需將父節點的邊權加上 d p [ u ] dp[u] dp[u] 即可。

當子樹求解完成時,與子節點相連的邊指向哪里已經不再重要,只需記錄并排序邊權即可,用 m u l t i s e t multiset multiset

代碼實現

其實細節很多:

1.C++11 及以上erase 返回刪除指定元素后下一個有效迭代器。

2.在 m u l t i s e t multiset multiset 中查找到第一個大于等于 y y y 的元素時一定要判斷,有可能就是自己,如果未判斷就刪除會引起各種奇怪錯誤。

  1. 我因為 r e s = m res = m res=m 放在 d f s dfs dfs 后,調了半天全輸出 0 0 0
#include <bits/stdc++.h>using namespace std;const int N = 5e4 + 100;
int n,m,L = INT_MAX,R,res,ans; 
bool vis[N];
struct Edges{int v,w;
};
vector <Edges> gra[N];void read(int &res){int x = 0,w = 1;char ch = 0;while(ch < '0' || ch > '9'){if(ch == '-') w = -1;ch = getchar();}while(ch >= '0' && ch <= '9'){x = (x << 3) + (x << 1) + (ch - '0');ch = getchar();}res = x * w;
}bool cmp(Edges a,Edges b){return a.w < b.w;
}int dfs(int u,int limit){vis[u] = true;//記錄與子樹相連的邊 int cnt = 0;multiset <int> match;//優先在子樹內求解for(auto edge : gra[u]){int v = edge.v;//連接父親的邊跳過 if(vis[v]) continue;match.insert(edge.w + dfs(v,limit));} //在當前子樹匹配//長度已經滿足的 for(auto it = match.begin();it != match.end();)if(*it >= limit){it = match.erase(it);res--;  }else{it++;}
//	需要兩兩匹配的for(auto it = match.begin();it != match.end();){int y = limit - (*it);auto _it = match.lower_bound(y);if(_it == match.end() || _it == it){it++;continue; } res--;match.erase(_it);it = match.erase(it);} if(match.empty()) return 0;return *match.rbegin();
}void solve(){int l = L,r = R,mid;while(l <= r){mid = l + r >> 1;memset(vis,false,sizeof(vis));res = m;dfs(1,mid);if(res <= 0){l = mid + 1;ans = mid;}else r = mid - 1;	}printf("%d\n",ans);
} int main(){read(n);read(m);int u,v,w;for(int i = 1;i < n;i++){read(u);read(v);read(w);gra[u].push_back({v,w});gra[v].push_back({u,w});L = min(L,w);R += w;}//二分答案solve(); return 0;
}

挺好的一道樹上二分+貪心。

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

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

相關文章

Portal認證過程雜談

Portal認證模型簡介 Portal認證模型通常由這四個設備組成 認證服務器即3A服務器&#xff0c;通常用radius服務器 接入設備通常就是NAC設備&#xff08;網絡接入控制&#xff09; Portal服務器就是Portal認證的認證網站&#xff08;通常叫門戶網站&#xff09; 認證過程簡述…

ZSGuardian ---AI賦能,新一代研發管理守護平臺 -即將上線

一場研發管理的革命 在數字化浪潮奔涌向前的今天&#xff0c;軟件開發與產品研發的節奏不斷加快&#xff0c;市場需求瞬息萬變&#xff0c;技術迭代日新月異。對于研發團隊而言&#xff0c;如何在復雜多變的環境中&#xff0c;高效地管理項目、保障產品質量、確保按時上線&…

小菜狗的云計算之旅,學習了解rsync+sersync實現數據實時同步(詳細操作步驟)

Rsyncsersync實現數據實時同步 目錄 Rsyncsersync實現數據實時同步 一、rsync概述 二、rsync運行原理 三、rsync部署 四、備份測試 五、使用非系統用戶備份數據 5.1 rsync的配置文件介紹 5.2 配置備份目錄 5.3 使用rsync用戶備份測試 5.4 pull拉取數據 六、rsyncse…

牛客周賽Round 99(Go語言)

A題 (A.go) 思路總結: 這道題要求判斷一個整數中是否包含連續的兩個9。 核心思路是將輸入的整數轉換為字符串&#xff0c;然后遍歷這個字符串&#xff0c;檢查是否存在相鄰的兩個字符都是9。如果找到了&#xff0c;就立即停止遍歷并輸出"YES"&#xff1b;如果遍歷完…

紅外圖像小目標檢測熱力圖可視化系統

原創代碼&#xff0c;可以工程修改含界面。

供應鏈管理:指標評估方式分類與詳解

一、指標評估方式分類與詳解 評估維度評估方式核心方法適用場景示例數據來源內部數據評估從企業ERP、MES、CRM等系統提取生產、財務、客戶等數據。成本、效率、質量等內部管理指標評估。生產成本數據&#xff08;MES系統&#xff09;、客戶滿意度&#xff08;CRM系統&#xff…

基于 Rust 的前端工具基本實現

1. Rust 環境安裝 1.1. 安裝 Rust Rust 提供了一個非常方便的安裝工具 rustup,可以通過以下命令安裝 Rust: curl --proto =https --tlsv1.2 -sSf https://sh.rustup.rs | sh 這個命令會安裝 Rust 編譯器 rustc、包管理工具 cargo 以及其他相關工具。 1.2. 配置環境變量 …

大模型關鍵字解釋

&#x1f4a1; 一、模型結構關鍵詞 1. Transformer Transformer 是一種專門用來“理解文字”的神經網絡結構。就像一個聰明的秘書&#xff0c;能同時看懂整段話的所有詞之間的關系&#xff0c;而不是像老式模型那樣一句一句讀。 &#x1f449; 舉例&#xff1a;以前的模型像…

空調和烘干機的使用

開關 制冷 選擇上下掃風 那個就下來了 烘干機 電源鍵 長按3s以上直到菜單顯示 選擇小件 不要快烘 至少1個半小時 才可以烘干

極簡的神經網絡反向傳播例子

我之前一直沒搞清楚&#xff0c;神經網絡為什么要求導&#xff1f;反向傳播又是什么&#xff1f;于是到現在深究回來…… 本質就是擬合一個未知函數。 高中的數理統計就學過最小二乘法這種回歸方法&#xff08;? 代表自己的預測y&#xff0c;這個表達要記住&#xff09;&…

01-什么是強化學習

什么是強化學習 1. 定義 強化學習&#xff08;Reinforcement Learning, RL&#xff09;是一種使智能體&#xff08;Agent&#xff09;通過與環境&#xff08;Environment&#xff09;不斷交互&#xff0c;學習如何在不同情境下采取行動以獲得最大化累積獎勵的機器學習方法。 強…

淘寶直播數字人:音視頻算法工程技術

本專題是我們打造智能數字人的部分實踐總結。我們將探討六大核心環節&#xff1a;LLM文案生產賦予數字人思考和內容生成能力&#xff0c;如同其“大腦”&#xff1b;LLM互動能力則聚焦對話邏輯與擬人化交流&#xff0c;是實現自然交互的關鍵&#xff1b;TTS&#xff08;語音合成…

MySQL回表查詢深度解析:原理、影響與優化實戰

引言 作為后端開發或DBA&#xff0c;你是否遇到過這樣的場景&#xff1a; 明明給字段加了索引&#xff0c;查詢還是慢&#xff1f;EXPLAIN一看&#xff0c;執行計劃里type是ref&#xff0c;但數據量不大卻耗時很久&#xff1f; 這時候&#xff0c;你很可能遇到了MySQL中常見的…

任務管理器看不到的內存占用:RAMMap 深度分析指南

前言&#xff1a;任務管理器看不到的內存真相 在日常使用 Windows 系統時&#xff0c;我們有時會遇到一種令人費解的情況&#xff1a; 剛剛開機&#xff0c;什么軟件都沒運行&#xff0c;系統內存卻已經占用了 7&#xff5e;8 GB。 打開任務管理器一看&#xff0c;前幾個進程加…

從傳統倉庫到智能物流樞紐:艾立泰的自動化蛻變之旅

在物流行業智能化浪潮中&#xff0c;艾立泰從依賴人工的傳統倉庫轉型為智能物流樞紐&#xff0c;其自動化升級路徑為行業提供了典型范本。?曾幾何時&#xff0c;艾立泰倉庫內人工搬運、紙質單據流轉、手工盤點是常態&#xff0c;效率低下、差錯率高、人力成本攀升等問題制約發…

408第三季part2 - 計算機網絡 - 滑動窗口

理解 幀本質就是一堆二進制&#xff0c;后面會將幀的格式 流量控制就是 B&#xff1a;急急急急急急 A&#xff1a;別急 A控制B&#xff0c;B控制C&#xff0c;C控制D&#xff0c;但D無法控制A&#xff0c;這就是相鄰節點 abc在發送的過程中發送完了 怎么才能繼續發送呢 沒…

RedHat高可用集群深度解析與優化

一、RHCS核心組件深度解析1. Corosync&#xff08;消息層&#xff09;通信機制改進說明&#xff1a; Totem協議采用環形令牌傳遞機制&#xff0c;在10節點以下集群中使用UDP/IP組播&#xff08;224.0.0.12&#xff09;&#xff0c;超過10節點建議改用UDP/UDP單播。典型配置示例…

為什么使用 XML Schema?

為什么使用 XML Schema? XML(可擴展標記語言)是一種廣泛使用的標記語言,它被設計用來存儲和傳輸數據。XML Schema 是一種用于定義 XML 文檔結構的語言,它為 XML 文檔提供了嚴格的驗證機制。以下是使用 XML Schema 的幾個主要原因: 1. 結構化數據定義 XML Schema 允許開…

ESP32藍牙學習筆記

藍牙 官網&#xff1a;https://www.bluetooth.com/zh-cn/learn-about-bluetooth/tech-overview/ 概述 分類&#xff1a;Bluetooth經典、Bluetooth低能耗(LE) GAP 通用訪問配置文件(Generic Access Profile, GAP)簡稱GAP&#xff0c;該Profile保證不同的Bluetooth產品可以互…

C#擴展方法全解析:給現有類型插上翅膀的魔法

C#擴展方法全解析&#xff1a;給現有類型插上翅膀的魔法 在 C# 的類型系統中&#xff0c;當我們需要為現有類型添加新功能時&#xff0c;傳統方式往往意味著繼承、重寫或修改源代碼 —— 但如果是string、int這樣的系統類型&#xff0c;或是第三方庫中的密封類&#xff0c;這些…