CodeVS沖杯之路 P1091

2022-05-18 04:46:33 字數 1154 閱讀 9259

不充錢,你怎麼ac?

題目:大家都寫的 dfs,然而我想到了一種貪心的做法,重點是可以a

普遍的貪心是每次刪掉該深度子樹最大的點,但是如果有一邊卡一條鏈就會wa

我們何不進一步考慮貪心,如果它下面是一條鏈我們就可以緩一緩到第 2 天再刪是不是,反正它每次也就增加乙個人

用 size[x] 記錄所有後代加上自己的節點個數,f[x] 記錄其最大子樹的 size 值

我們考慮第一次不刪這個節點,讓它先擴充套件一次,然後第二次再刪除它子樹中 size 最大的節點

那麼設 g[x]=size[x]-f[x],g 就為第一次不刪,第二次刪掉其最大的子樹還剩餘的節點數

那麼一層層地貪心,每次刪掉 g 值最大的節點,直到不再繼續傳染為止

貪心跑得飛快~

1 #include2 #include3 #include4 #include5 #include6 #include7 #include8

using

namespace

std;910

const

int n=301

;11 stacks,q;

12int first[n],v[n*2],next[n*2

],size[n],g[n],f[n];

13void dfs(int x,int

fa)14

23 size[fa]+=size[x];24}

25int

main()

2638

for (i=1;i<=n;i++) size[i]=1

;39 dfs(1,0

);40

for (i=1;i<=n;i++) g[i]=size[i]-g[i];

41 s.push(1

);42 g[0]=size[0]=0

;43 ans=n;

44while (!s.empty())

4557}58

while (!q.empty())

5965

}66 printf("

%d\n

",ans);

67return0;

68 }

這裡有個dfs的:

貪心的做法證明有人會嚴謹的嗎?會的話告訴我謝謝!

CodeVS沖杯之路 P1165

不充錢,你怎麼ac?題目 題目很簡單,最好寫樸實一點,不要想著哪些情況可以合併在一起啊等等 老老實實乙個個判斷,不然很容易出錯 細節很多,幸好樣例給的良心,可以檢測出很多細節 自己字串模擬即可,一定要細心!1 include2 include3 include4 include5 include6 ...

CodeVS沖杯之路 P1092

不充錢,你怎麼ac?題目 嗯,這道題有一定難度啊,需要先用擴充套件歐幾里得演算法求出逆元,然後按照大小構一顆帶邊權為小時數的樹 樹鏈剖分後在樹上dp,設f i j 為以 i 為根 j 為子樹的最小的那一天 注意dp方程是有單調性的,可以用動態仙人掌維護,最後答案容斥一下即可 目測 量8k 1 inc...

CodeVS沖杯之路 P1171

不充錢,你怎麼ac?題目 調了很久才調好啊,一開始題目都看錯了 要是真的noip肯定沒戲了quq 後面發現codevs上的資料輸入最後是沒有回車的,導致wa爛啊 給你兩個串,它們每個字母有一一對應的關係,如果遇到不同字母對應相同的就 failed 或者相同字母對應不同字母也 failed,如果最後 ...