CSP-S 模擬50

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 的點(即要連邊的點)輸出

相關文章
相關標籤/搜索