T1上來就想到填坑,後邊想了倆小時都沒想出來,就交了一個暴力水了30數組
T2 用莫隊水過的(我沒臉)函數
T3 不會spa
而後放成績,在T2的大幅加成下,拿到了130分的好成績blog
T1 施工(好題)it
對於一個l,r的建築物之間有坑(全部的都比兩邊小),最好把它填平im
Dp數組定義f[i]表示前i個建築物的代價,且第i個建築物不增高,顯然是把i做爲了一個小範圍內最高建築物處理的統計
f[i]有f[j]轉移過來,j爲i前某一個建築物且j~i之間沒有比他倆高的建築物,這是一個「坑」img
設都填成高度爲t的,填平的代價是 di
$ \sum\limits_{k=j+1}^{i-1}(t-h_k)^{2}+c*(h[i]+h[j]-2*t) $co
這是個關於t的二次函數 $ A=i-1-j$ $B=-2*\sum\limits_{k=j+1}^{i-1}h_k-2*c$ $C=h[i]+h[j]+\sum\limits_{k=j+1}^{i-1}h_k^2$
直接求出最優的 t=B/(-2A) 更新答案便可
T2 蔬菜
正解四維偏序(那是個啥東東?)
我用二維莫隊,「暴力」碾標算
T3 聯盟(好題)
dfs 求直徑長度
dfs 把直徑這條鏈抽出來
由於被刪的邊必定是直徑上的邊,不然的話直徑不減
那麼從已經抽出來的直徑裏一個個枚舉邊,
考慮刪掉它整棵樹會變成兩個聯通塊(樹),兩棵樹合併的直徑最小是$ max(直徑_1,直徑_2,ceil(直徑_1/2)+ceil(直徑_2/2)) $
求這兩棵樹的直徑的話,考慮原直徑的兩個端點會分別在這兩棵樹裏,並且必定在分別的直徑上(由於在最長鏈上)
分別從這兩個端點dfs預處理原樹每個點到這兩個端點的距離,那麼一個聯通塊中的直徑就是這個聯通塊裏的點到端點的最大距離(這個端點包含在這個聯通塊裏)
第一問求出最小的直徑
第二問 統計一下直徑爲最小直徑的個數,並記錄可刪的邊的編號
第三問 隨便找可斷的邊的倆端點,在找這兩個聯通塊中dis(到端點的距離)爲該聯通塊直徑/2 的點(即要連邊的點)輸出