被 t2 幹崩了
A
給定一張若干個邊仙人掌組成的無向圖,至多斷掉其中 \(k\) 條邊,求最大連通塊數目。
\(3\le n\le 10^6, \ 0\le k\le m\le 2\times 10^6\)
先斷橋,再斷環,斷環的第一條邊沒有貢獻。
B
給定 \(n, m, k\) 和 \(m\) 個數,你需要將 \(1\sim 2^n - 1\) 劃分給兩個人 A 和 B,滿足若一個人被得到了兩個數 \(x, y\) 則必須得到數字 \(x\text{ or } y\)。此外,要求其中 \(m\) 個給定的數必須劃分給 A,並且 A 恰好得到 \(k\) 個數,求一種劃分方案或無解。
\(n\le 18, \ m,k\le 2^n - 1\)
步步遞進分析。從最表面觀察,不妨欽定選擇數字 \(2^n - 1\) 的人是 A,那麼對於 B 來說一定存在一個二進位制位 \(x\) 滿足該位為 \(1\) 的數字都分給了 A。可以反證,如果不存在這樣的 \(x\) 則 B 的所有數字 \(\text{or}\) 起來等於 \(2^n - 1\),不合法。
因此,A 將得到 \(2^{n - 1}\)。去掉 \(x\) 這一位之後,剩下 \(2^{n - 1} - 1\) 個數,發現是子問題,可以透過 \(m = 0\) 的部分。
當 \(m > 0\) 時,反過來就是這 \(m\) 個數不能分配給 B,可以考慮狀壓。設 \(f_S\) 表示剩下沒有去掉的二進位制位集合為 \(S\),此時是否存在一種合法方案。轉移列舉當前去掉的位 \(x\),利用 \(k\) 的第 \(\text{popcnt} (S)\) 位是否為 \(1\) 判斷一下是分給 A 還是 B。如果分給 B,判斷一下是否存在數字是 \(S\) 的子集,並且不是 \(S\backslash \{x\}\) 的子集,這個條件可以透過對 \(m\) 個數做一次高維字首和完成。時間複雜度 \(\mathcal O(2^nn)\)。
- 啟示:分析表面,尋找子問題。
C
一個長度為 \(n\) 的網格紙條,每個格子有一種顏色。共 \(q\) 次詢問,每次給定 \(u, v\),求從 \(u\) 走到 \(v\) 的最小時間。行走時,每個單位時間可以走一步到與當前格子顏色相同的相鄰格子,或者將某一個格子染成任意一種顏色。
\(1\le n,q\le 10^6\)
卡常題真下頭。
一種方法是無腦將擋牆格子顏色改成下一個格子的顏色。考慮兩個格子若顏色相同,可以先將中間的格子顏色推平,這樣可以節省一個單位時間。這樣轉化為選擇若干對顏色相同的格子對,滿足每對格子互不交叉,可以直接倍增。
D
一棵樹,初始時所有點都是黑的。共 \(n - 2\) 次操作,每次將一個點染成白色,每次操作後求所有黑色點之間的距離最小值,以及有多少對這樣的黑點,強制線上。
\(2\le n\le 5\times 10^5\)
樹上領域問題,顯然需要先建立點分樹。
總答案應是點分樹每個子樹的答案綜合起來。考慮對於上每個點 \(u\),求出其點分樹上的子樹中所有黑點與該點的距離,用桶統計,並維護 \(p_u, q_u\) 表示子樹內黑點與 \(u\) 的最小距離和次小距離,那麼第一個答案為 \(\min\limits_u \{p_u + q_u\}\),第二個答案也不難用桶算出。由於答案不減小,總答案也可以用桶維護。
時間複雜度 \(\mathcal O(n\log n)\)。