Codeforces 倒刷計劃

CG#1G

  題意:給出一棵 $N(\leq 5 \times 10^5)$ 個點的樹,有些點已經被染成白色。甲乙兩人博弈,甲每次把一個沒染過的點染成白色,乙染黑色,甲先操做。任意時刻,若是出現一條同色的三個點的鏈,該顏色方就勝利。若雙方都執最優策略,判斷勝負或平局。   題解:若是有度數爲 $4$ 的點,白方第一步就能夠選那個點,必勝。相似地,若是存在一個度數爲 $3$ 的點,且它有兩個支鏈長度至少爲 $2$(黑方一次只能堵住一個),白方依然必勝。由該結論獲得推論:若是有至少 $3$ 個度數爲 $3$ 的點,白方必勝。現討論圖裏有幾個度數爲 $3$ 的點。   ① $2$ 個,記爲 $p$ 和 $q$。由上述結論,除了中間一條長鏈,$p$ 和 $q$ 另外兩側的支鏈必然只有一個點(不然白方勝)。並且,若是圖中至少有一個白色點已經塗好,也必然白方勝。注意此時不必定是平局,還要觀察中間長鏈的奇偶性。   ② $1$ 個,記爲 $p$。顯然 $p$ 除了一條長鏈連出去,另外兩側必然只有一個點。若是無任何初始白點則平局(白方每走一步,黑方貼着它左邊下)。若是有一個不在長鏈末端的白點則白方勝;不然要判斷長鏈的奇偶性。   ③ $0$ 個。就是一條鏈。位於中間的已經染過的白色格子,或者存在距離差爲偶數的兩個白色格子都是白方贏,不然平局。數組

CR#534B

  題意:交互題。要猜出一個未知正整數 $a(1 \leq a \leq 10^9)$。每次給judge兩個數 $x$ 和 $y$,返回 $x \mod a \geq y \mod a$ 是否成立。最多進行 $60$ 次這樣的操做。   題解:若是咱們詢問一組 $(t,2t)$,考察會出現怎樣的結果:當 $t<a<2t$ 時必然不成立,當 $t \geq 2t$ 時必然成立,其他狀況不肯定。咱們想借助後面兩個條件來二分,因此會要求先估計出 $a$ 的一個下界。   有 $60$ 次操做限制,因此還能再進行一次相似於二分的操做。咱們能夠先從小到大詢問 $(2^k,2^{k+1})$,找到第一個不成立的區間:這時候就肯定了,$a$ 必然落在區間 $(2^k,2^{k+1}]$。而後再對 $a$ 直接二分。稍做修改,每次詢問 $(2^k,mid)$,便可肯定二分方向。函數

CR#534C

  題意:給出一個每一個點度數至少是 $3$ 的簡單連通圖。讀入 $K(K \leq N \leq 2 \times 10^5)$,或者找到一個長度至少爲 $\frac{N}{K}$ 的簡單路,或者找到 $K$ 個環,知足:①環長至少都是 $3$。②環長不能是 $3$ 的倍數。③每一個環裏至少要有一個點不在別的找到的環裏(咱們稱之爲表明點)。   題解:只要利用上題目中的古怪條件和限制就能出解。首先,簡單路是十分Hard的,因此必然是 DFS 式地找簡單路,並搜出一棵生成樹。若是沒有達到第一個要求,那麼咱們搜出的生成樹高度 $<\frac{N}{K}$,即至少有 $K$ 個葉子。這和要求的環的數量吻合,因此嘗試把這些葉子做爲表明點去找那 $K$ 個環。由於每一個點度數至少爲 $3$,因此葉子至少有兩條不一樣的返祖邊,它們會造成 $3$ 個環。鴿籠原理,必然有一個環長不是 $3$ 的倍數且至少爲 $3$ 的環。優化

CR#534D

  題意:給出 $N(\leq 10^6)$ 個正整數 $a_i(\leq 10^{12})$。能夠選擇一些數,除掉一個本身的約數 $d_i(d_i | a_i)$(且知足 $d_i \leq K$)。每個數還有一個修改代價 $p_i$。對於你選擇修改的數的集合 $S$,總代價爲 $|S| \times \sum \limits_{i \in S} p_i$。要使得全部數的GCD爲1,求最小總代價。   題解:將初始的 GCD 質因數分解,不一樣質因子個數 $m \leq 11$。顯然,咱們最終目的是將這 $m$ 個質因子劃成一些集合,每個集合對應一個數(同時要符合 $k$ 的要求),使得 「集合數 $\times$ 代價和」最小。   將 $a_i$ 對這 $m$ 個質因子分解,獲得一些 $m$ 維向量。 徹底相同的向量最多隻需保留代價最小的 $m$ 個。   標程的作法是,直接暴力枚舉全部合法的劃分。每一個集合要配一個不一樣的數,因此要預處理能覆蓋集合 $S$ 的代價前 $m$ 優的數字,而後把這些集合和它們拓展出來的這些數字作一個匹配。每次匹配是,左側最多 $x$ 個點($x$ 爲集合數),右側最多 $x^2$ 個點,單次複雜度 $O(x^3)$,總複雜度 $\sim 10^8$   還有一個 DP 解法。設 $f_{i,j}$ 爲:如今覆蓋了集合 $i$,且正好選了 $j$ 個集合的最小代價和。把可能成爲答案的向量都丟進去 DP 一遍。我以爲複雜度存疑。spa

CR#532F

  題意:給出 $N(\leq 5 \times 10^5)$ 個數和 $Q(\leq 5 \times 10^5)$ 個詢問,每次給你 $(l,r)$,問 $l \sim r$ 這些數裏選一些異或能湊出的最大的數是多少。51nod 1577原題。   題解:顯然是區間提取線性基。線段樹暴力是 $O(N \log^3 N)$ 的,採用優美的 CDQ 分治能夠作到 $O(N \log^2 N)$。   有一種比較玄學的 $O(N \log N)$ 解法。對於一個區間的結束位置 $r$,維護 $1 \sim r$ 的線性基,並且它是由最靠後的這些數字構造出來的。具體地,每次插入 $a_r$ 時,從大到小枚舉有 $1$ 的每一位:若是該位爲空,插入並退出;不然,選擇位置靠後的數字放入,剩下的數字消掉這一位後繼續往前循環。   爲何要這麼維護呢?對於一個有端點 $=r$ 的詢問,取線性基裏全部位置 $\geq l$ 的數字出來,便是關於它的線性基。基於此直接詢問便可。設計

ECR#58F

  題意:有 $N(\leq 400)$ 個城市,第 $i$ 個城市位於 $a_i(\leq 10^9)$ 千米處。 有 $M(\leq 250000)$ 輛卡車在運輸,第 $i$ 輛車要從城市 $s_i$ 到 $t_i$,每千米耗油 $c_i$,且最多能在沿途通過的城市加油 $k_i$ 次(每次加滿)。設計一個全局卡車的最小油箱容量使得全部限制都被知足。   題解:一種直觀的想法是二分答案,而後就掉進死衚衕了……其實能夠直接算出每一個卡車的最小要求取個 max 的。   由於 $N$ 比較小,考慮對城市進行 DP。限制不少,並且 $c_i$ 彼此不同,因此要把和路程有關的量放在 dp 數組的值裏。枚舉每個起點 $s$,設 $dp_{i,j}$ 表示從 $s$ 到 $i$,最多能加 $j$ 次油的狀況下,最小的可行油箱容量。該 DP 能夠經過單調性 $O(N^2)$ 預處理出。而後跑一遍相同起點的限制算一算便可,總複雜度 $O(N(N^2+M))$。排序

ECR#58G

  題意:給出 $N(\leq 2 \times 10^5)$ 個數。將它們劃成一些連續的段,每一段的值爲這一段數字的異或和。對於一種劃分方案,若是不存在異或和爲 $0$ 的段的集合,則稱之爲合法劃分。求合法劃分最多能劃成幾段。   題解:顯然是線性基相關的題。一個很重要的發現是,每一個段自身的異或和 $xor_1,xor_2,\dots$ 構成的線性空間,等價於前綴異或和 $sum_1,sum_2,\dots$ 構成的線性空間。$sum_n$ 必須選,而後就只要從後往前掃描,每次把 $sum_i$ 丟進去,若是不能消掉,就選上這一段。複雜度 $O(N \log N)$。it

CR#530C

  題意:構造一個 $N(\leq 10^5)$ 個點、每一個點深度之和爲 $S(\leq 10^{10})$ 的樹,要求度數最小。   題解:對於固定的 $N$ 最大度數 $d$,能構出的樹的 $S$ 是一段連續的區間。因此咱們能夠直接肯定出最小度數 $d$。構造的時候,我採用逐層構造。在每一層,放了(肯定了)若干個點後,剩下能構造出的 $S$ 也是一段連續的區間,並且這些區間是有單調性的。因此每次二分放多少個點,繼續往下構造便可。class

CR#530D

  題意: 每次選擇兩個數 $(a,b)(a \leq b)$ 合併成 $a+b$,這樣 $N$ 個數合併 $N-1$ 次後就只剩下一個數了。合併過程當中,每出現 $b \leq 2a$ 的狀況,不肯定值就加一。如今有 $T(\leq 5 \times 10^5)$ 個操做,每次加入一個數或者刪除一個數,或者問當前數字集合的全部合併方案中,不肯定值之和最大多是多少。   題解:比較傳統的套路題?不加證實地猜測,每次挑最小的兩個數合併會使得不肯定值之和最大。可是哈夫曼樹是不能動態維護的。手畫一些例子發現很難出現 $b > 2a$ 的狀況。將原數組排序後,顯然 $2\sum \limits_{i=1}^{k-1} a_i < a_k$ 是 $b > 2a$ 的充分條件;其實這也是必要條件。考慮直接用權值線段樹來維護這些操做。每次暴力累加一段前綴的和 $x$,而後線段樹裏尋找第一個大於等於 $2x+1$ 的數。每次至少擴大兩倍,總複雜度 $O(N \log^2 N)$。原理

Hello 2019 D

  題意: 黑板上寫了一個數 $N(\leq 10^15)$,操做 $K(\leq 10000)$ 次,每次將其等機率變成它的一個因數。問最後留在黑板上的數的指望。   題解: 很old的題了。一個顯然可是重要的結論是:各質因子之間獨立。每一個質因子計算時只要考慮質數就行。對於每個質因子直接 $O(Kc)$ DP便可,總複雜度就是 $O(K \log N)$。也能夠一開始全都預處理好,設 $f_{i,u,v}$ 表示 $u$ 通過 $i$ 輪到了 $v$ 的機率,能夠用前綴和優化成 $O(K \log^2 N)$。循環

Hello 2019 F

  題意:維護 $N(\leq 10^5)$ 個可重集,一共有 $Q(10^6)$ 個操做。①將第 $i$ 個可重集設置爲只有一個元素 $v$ 的集合。②將第 $i$ 個集合設置爲第 $j$ 個和第 $k$ 個的並。③將第 $i$ 個集合設置爲第 $j$ 個和第 $k$ 個的乘。定義乘操做爲:$\forall x \in S_j,\forall y \in S_k,(x,y) \in S_i$。④詢問元素 $v$ 在第 $i$ 個集合裏出現了奇數次仍是偶數次。 $v \leq 7000$。   題解:一看數據範圍就是 $bitset$ 亂搞的題。由於是問奇偶性,容易發現,只要維護可重集裏每一個數是否出現了奇數次。③ 操做看起來十分難維護。從集合反演那套理論中得到啓發,嘗試將集合轉化成「另外一種形式」來維護。gcd和因數有很大的關聯,對於①操做,考慮將全部 $v$ 的因數標爲 $1$,觀察是否能維護;即,用 $F_x=\sum \limits_{x|y} S_y$ 來表示集合 $S$。驚奇地發現,③ 操做能夠直接用 $F_x \cap F_y$ 來快速維護。而 ② 操做依然是簡單的 $\oplus$ 操做。至於詢問的話,能夠直接預處理莫比烏斯函數,也表示成 $bitset$ 形式,就能夠作到快速詢問了。總複雜度 $O(\frac{QV}{32})$。

Hello 2019 G

  題意:給出一個 $N(\leq 10^5)$ 個點的樹,一共有 $2^N$ 種點集選取方案。設 $f(S)$ 爲,在樹上將點集 $S$ 連起來須要用到的邊的數量。求 $\sum f(S)^K$。$K \leq 200$。   題解:先考慮暴力 DP,用一個長度爲 $K+1$ 的數組,來維護當前全部方案的 $0,1,\dots,K$ 次方的和。在原樹上 $DP$,設 $f_{x}$ 表示 $x$ 子樹裏至少選擇一個點的方案數組。爲何要至少選一個點呢?這樣就要強制往上連邊了。對於一種點集選取方案,在它們的 $LCA$ 處統計答案。很容易設計出一個 $O(NK^2)$ 的作法(會出現兩個方案數組關於組合數卷積的操做)。   這種 $K$ 次方的題,確定是用第二類斯特林數優化。嘗試將方案數組的結構改一改。原本的意義是:第 $i$ 個數是全部方案的 $i$ 次方之和;如今的意義是:第 $i$ 個數是 $\sum C_{x}^(i)$($x$ 是全部方案的值)。通常斯特林數優化的題只會出現答案總體加一的狀況,這樣新的方案數組能夠相似於組合數的轉移,複雜度從 $O(K^2)$ 降爲 $O(K)$。   但此題中,會出現兩組答案合併(左右兩個集合裏的方案兩兩組合構成新的答案)的狀況。通常的,咱們有: $\sum \limits_{u} \sum \limits_{v} C_{u+v}^k=\sum \limits_{i=0}^k [\sum \limits_{u} C_u^i] \times [\sum \limits_{v} C_v^{k-i}]$ (考慮組合數實際意義便可證實)。因此依然能夠用卷積的方式來合併。   問題是:如今的合併複雜度依然是 $O(K^2)$ !注意到本題是在樹上作,是有特殊性質的。對於一個子樹大小爲 $size_x(size_x \leq K)$ 的子樹,它內部點集不管怎麼選,邊最多 $size_x-1$ 條,因此方案數組 $\geq size_x$ 的位置必然是 $0$。咱們能夠用樹形揹包的經典 $trick$,每次只 $for$ 到 $\min(size_x,K)$,複雜度就能變成 $O(NK)$。

相關文章
相關標籤/搜索