c 城將要舉辦一系列的賽車比賽。在比賽前,需要在城內修建mm
條賽道。
c 城一共有nn
個路口,這些路口編號為
1,2,…,n1,
2,…,
n,有n-1n−1
條適合於修建賽道的雙向通行的道路,每條道路連線著兩個路口。其中,第ii
條道路連線的兩個路口編號為
a_iai
和b_ibi
,該道路的長度為
l_ili
。借助這
n-1n−1
條道路,從任何乙個路口出發都能到達其他所有的路口。
一條賽道是一組互不相同的道路
e_1,e_2,…,e_ke1
,e2
,…,
ek,滿足可以從某個路口出發,依次經過 道路
e_1,e_2,…,e_ke1
,e2
,…,
ek(每條道路經過一次,不允許調頭)到達另乙個路口。一條賽道的長度等於經過的各道路的長度之和。為保證安全,要求每條道路至多被一條賽道經過。
目前賽道修建的方案尚未確定。你的任務是設計一種賽道修建的方案,使得修建的mm
條賽道中長度最小的賽道長度最大(即mm
條賽道中最短賽道的長度盡可能大)
輸入格式:
輸入檔案第一行包含兩個由空格分隔的正整數
n,mn,m
,分別表示路口數及需要修建的 賽道數。
接下來n-1n−
1行,第ii
行包含三個正整數
a_i,b_i,l_iai
,bi
,li
,表示第ii
條適合於修建賽道的道 路連線的兩個路口編號及道路長度。保證任意兩個路口均可通過這
n-1n−1
條道路相互到達。每行中相鄰兩數之間均由乙個空格分隔。
輸出格式:
輸出共一行,包含乙個整數,表示長度最小的賽道長度的最大值。
【資料規模與約定】
對於所有的資料,
2 ≤ n ≤ 50,0002≤
n≤50
,000
,1 ≤ m ≤ n-11≤
m≤n−
1,1 ≤ a_i,b_i ≤ n1≤
ai,
bi≤
n,1 ≤ l_i ≤ 10,0001≤
li≤
10,0
00。題解:
題意即求乙個k段不相交路徑長度最小值的最大值;
二分這個最大的最小值mid,那麼要求判斷是否有一種方案可以分出》=k條路徑使得權值都》=mid;
樹形dp : 當做到節點u,要麼u的所有兒子都一定成為了路徑,要麼至多有一條可以向上延伸的路徑;
這樣如果可以在u形成》=mid的路徑,那麼一定比此時不形成路徑往上連更優;
記錄每個點可以往上連的權值val,考慮u的兒子v,u,v之間的邊為e[i] (**風格,忍受一下。。)
val[v]+e[i].w >= mid 直接統計為一條合法路徑;
否則把左邊存在乙個陣列裡,可以知道要形成路徑只能兩兩配對,排序後二分可以確定最大的對數;
注意未配對的最大的數可能可以替換已配對的權值,找到最大可替換數設定成val[u](注意細節)
複雜度 $o(n log^2 n)$
1 #include2 #include3 #include4 #include5view code#define inf 0x3f3f3f3f
6#define rg register
7#define il inline
8#define run(i,l,r) for(int i=l;i<=r;i++)
9using
namespace
std;
10const
int n=50500;11
intn,k,o,hd[n],mid,val[n],sum,p[n];
12 vectorg[n];
13struct edgee[n<<1
];14
void adde(int u,int v,int
w);hd[u]=o++;
16 e[o]=(edge);hd[v]=o++; 17}
18bool check2(int u,int
mid)
24return
true;25
}26void dfs(int u,int
fa)37
int cnt=(int
)g[u].size();
38if(!cnt)return;39
sort(g[u].begin(),g[u].end());
40int l=0,r=cnt>>1;41
while(l
46 sum+=l;
47if((l<<1)==cnt)return;48
for(int i=0;i)
54int
t;55
for(t=cnt-(l<<1);t1]+g[u][p[t]]>=mid;t++)
59 t--;
60return
void(val[u]=g[u][t]);61}
62bool
check1()
66int
main()
77while(l
82 printf("
%d\n
",l);
83 }//
by tkys_austin;
Luogu5021 NOIP2018 賽道修建
luogu5021 noip2018 賽道修建 一棵大小為 n 的樹,邊帶權。選 m 條鏈使得長度和最小的鏈最大。m貪心,二分答案 最小最大?二分 先看部分分 於是可以將兩種做法結合 對於每個節點,往上算貢獻 貪心匹配兩個兒子 至於實現,可以考慮 multiset 也可以排序 二分 時間複雜度 o ...
2018 NOIP備戰計畫
2018 noip目標 1 刷完紫書數論習題 2 聽51nod講座和習題,根據其知識結構來備戰。3 刷完紫書動規 4 初賽前兩個星期左右開始複習 刷紫書動規的時候感覺偏難,進步緩慢。應該自己調低難度 兩個大任務 1 51nod講座 2 按照 演算法競賽高階指南 中動規的分類來刷 線性動規,狀壓動規,...
NOIP 2018 考前須知
day 0day0 day0 來水一發 不要太死板,靈活分配時間,拿到盡量多得分 不失誤就是成功 noip2018 rp 以下by 官方 老師 一.考試進場前。1.早餐一定要吃,不用特別,不要吃得太飽。2.帶手錶一塊 鉛筆或簽字筆一到兩支 三證 學生證 准考證 身份證 二.進場以後 此時離考試開始一...