2024年8月6日 加訓
賽時只過了 C。D 有思路,不過沒寫。
A CF1969E 2402*
把一個數修改之後,顯然直接把序列拆成兩個部分。
找出所有的 \((\text{prev}(i), \text{next}(i))\),那麼所有合法區間都是包含 \(i\) 的子區間。
然後考慮 dp 劃分,f[i]
表示字首 \(i\) 最少需要幾次修改,轉移就是當 \((j ,i]\) 是合法子區間,可從 \(f[j] + 1\) 轉移過來。
假了。判斷所有子區間是不是合法區間非常難。
題解
直接從左往右貪心啊哥們,你在 dp 牛魔。這都沒想到直接退役吧。
B CF1957F2 2847*
樹,點有點權。\(q\) 次詢問,找出樹上兩條路徑 \(u_1\to v_1\) 和 \(u_2\to v_2\) 哪些點權的出現次數不一樣,最多找 \(10\) 個即可。
不會啊,初步想法 XOR HASHING,或者點分治,但是如果是出現次數這種問題,還得是 XOR HASHING 或者根號分治吧,但也不像能根號的樣子(完全沒找到什麼能均攤)。感覺這題應該挺隨機化的。
題解
考慮簡單版本的,在序列上,求兩段區間哪些顏色出現次數不同。
做法是給每種顏色隨機一個雜湊值,然後扔到主席樹上,可以在主席樹上二分找出哪個顏色出現次數不同。
樹上同理,拆成 \(u\to \text{root}\) 的路徑,對這個建立主席樹,查詢 LCA 即可。
C CF1957E 2501*
感受了一下,應該是個威爾遜定理。因為求 \(C(i, k) \bmod k\) 實際上等於:
你這玩意,化簡之後有 \(k\) 項,顯然是 \(1, 2, \cdots, k-1\),還有一個 \(\lfloor\frac{i}{k}\rfloor\)。
我們知道前面這個 \(1\sim k-1\) 乘起來,顯然有:
我願稱之為擴充威爾遜定理。
所以:
考慮列舉 \(k\) 即可,對 \(4\) 的處理應該不用多說,把 \(2\) 提出來,剩下的可以 \(O(1)\) 求。然後題目變成求:
怎麼感覺有點熟悉,\(i\bmod k = i - k\lfloor\frac{i}{k}\rfloor\),這個式子可以化簡為:\((k - 1)\lfloor\frac{i}{k}\rfloor = i - i \bmod k - \lfloor\frac{i}{k}\rfloor\)。這個還要對 \(k\) 驅魔,顯然前面兩項可以刪掉。於是變成 \(-\lfloor\frac{i}{k}\rfloor\)。
對 \(k\) 列舉倍數,變成區間加,可處理出 \(n = 1\sim 1000000\) 的答案,複雜度 \(O(n \log n)\)。不過在上面那個未化簡的式子的時候就可以做了。
原來這麼多知識點中我數論學的最好
D CF1956E2 2906*
不是很懂,模擬?但是模擬不出來。
好像可以模擬直到第一個 \(0\) 出現,這一步是 \(O(n\log v)\) 的(大概),因為在 \(n = 3\) 的時候類似一個斐波那契,所以 \(n\) 為奇數大概就是斐波那契了。\(n = 2\) 也是同理,好像走一圈就可以得到斐波那契形式的不等式。
找到第一個 \(0\),就能找到第一個一定存活的位置,繼而找到下一個 \(0\)。
找到一個一定存活的位置 \(i\),設其值為 \(x\) 可以知道 \(i + 1\) 將會經歷:\(y\to y-x\to y-2x\to \cdots\),這個顯然可以 \(O(1)\) 求。得到其存活 \(k\) 輪。接下來,我們考慮 \(i + 2\),將會經歷:\(z\to z-y+x\to z-2y+3x\),這個顯然是一個關於時間的二次函式,係數還是非 \(0\) 整數,所以 \(z\) 存活不超過 \(\sqrt a_i\) 輪,這個沒關係,我們仍然暴力二分。再往下,\(p\) 就不會存活超過 \(\sqrt[3] a_i\) 輪了,我們可以直接保留權值這些變化的權值,直接做,是 \(O(n\sqrt[3]{a_i})\) 的。如果感覺不夠保險,可以用三次函式二分,然後保留四次函式的權值,是 \(O(n\sqrt[4]{a_i})\) 的,這還不能過?
題解
差不多是這個意思,我們暴力做 \(\sqrt[3]{a_i}\) 輪,任何連續 4 個有值的都會死。然後在單個塊中查詢。本質相同,實現不同罷了。我的做法是按邊統計邊分割,此做法是先分割再統計。但是 u1s1,題解的做法更快。
然後我會證明找到第一個 \(0\) 是 \(O(\log v)\) 的了。其實就是 \(x^{k} = v\),求 \(k\) 的最大值。顯然 \(x=2\) 時 \(k\) 最大,為 \(\log v\)。
E CF1951F 2609*
這能寫?感覺沒啥性質,特別是置換我很不熟悉。更主要的,C 和 D 花太多時間,現在沒時間了。
題解
考慮排列 \(p\) 中的順序和逆序對分別會對 \(k\) 產生什麼影響。
若 \(p\) 中存在 \(p_i > p_j, i < j\),對 \(q_{p_i}\) 和 \(q_{p_j}\) 的值分討,會發現一定會產生 \(1\) 的貢獻。
若 \(p\) 中存在 \(p_i < p_j, i<j\),分討後會發現產生 \(0\) 或 \(2\) 的貢獻,
然後對 \(q\) 從前往後填,假設在填位置 \(i\),找到 \(i\) 在 \(p\) 中的下標 \(j\),然後考慮 \(j\) 能和在其後面且大於他的構成幾個順序對 \(c\),如果 \(k > c\) 就直接填當前最大數,否則就討論一下即可。
F CF1949J 2727*
先伸展一下,然後直接走進目標位置不就好了?
問題在於,怎麼判斷縮回去哪個格子,格子往哪邊走。往那邊走比較簡單,從目標節點開始 BFS,找到最近的點,然後沿最短路前進就好了。問題在於,怎麼判斷縮回去哪個格子,要求縮回去的格子不是割點。
題解
雙向搜尋,每個狀態朝可達的字典序最小的狀態移動。但感覺需要證明這樣搜一定能到達目標狀態。
官解是,找到一個 A 的外邊界與 B 的外邊界之間的最短路,然後對 A、B 分別建立一棵樹,A 不斷刪葉子,B 不斷加入一個節點。所以上面所說的問題的解法就是建樹。