就寫我打了的。
並不是官方題解的翻譯,是我做的方法。
部分題目沒寫好。
Codeforces Round #699 (Div. 2)
A. Space Navigation
判斷起點到終點的方向,保留有需要的方向再判斷。
B. New Colony
暴力。如果有一個進入垃圾桶,后面的肯定都進入垃圾桶。
C. Fence Painting
除了最后一個工匠以外,前面的工匠的作品都可以選擇被覆蓋掉。找到所有需要變化的顏色,模擬即可。
D. AB Graph
E. Sorting Books
先留着。
Codeforces Round #700 (Div. 1)
A. Searching Local Minimum
考慮三分每次可以把序列長度 \(\times \dfrac{2}{3}\)。注意邊界的特判,容易 FST。
B1. Painting the Array I
過是過了,但是我的方法似乎很垃圾,所以先留着。
B2. Painting the Array II
先留着。
Codeforces Round #701 (Div. 2)
A. Add and Divide
肯定先加后除。\(b=1\) 就加到 \(2\)。枚舉 \(b\) 的值就可以了,注意到 \(b\) 不應該很大。
B. Replace and Keep Sorted
先暴力寫出式子,發現很多項可以消去。最后式子中只剩下首項末項。
C. Floor and Mod
注意到只要滿足 \(a=xb+x\) 且 \(x<b\) 即可。對於一個 \(b\) 找到能對應多少個 \(a\)。列出式子發現式子中帶有一個 \(\min\),分類討論 \(\min\) 的取值條件。發現前半部分可以直接計算,后半部分整除分塊。
D. Multiples and Power Differences
黑白染色后,黑格子 \(720720\),白格子 \(720720-x^4\)。
E. Move and Swap
題目都沒看。
Educational Codeforces Round 104 (Rated for Div. 2)
A. Arena
除了最垃圾的其他都可以。
B. Cat Cycle
???為什么我的做法這么麻煩?做了 40 min 大草。
C. Minimum Ties
奇偶分類討論。發現偶數可以做到不平局,每個人贏一半輸一半。奇數的話每個人平一局,剩下的一半贏一半輸。證明不會。
考慮構造,平局的話 \(1\) 和 \(2\) 平, \(3\) 和 \(4\) 平,其他類似,這樣構造就好了。輸贏的構造可以分奇偶。
D. Pythagorean Triples
所以只要 \(b\) 和 \(c\) 的差為 \(1\) 的勾股數就能滿足。然后可以二分或者直接算。
E. Cheap Dinner
做 \(3\) 次 DP。顯然 \(3\) 次是互不干擾的。每次的時候就是扔掉有關系的,在剩下的里找最小值。然后考慮用一個數據結構維護就行了。我翻了很多人的記錄,似乎就我是用線段樹的。
F. Ones
我只知道貪心是錯的。
G. String Counting
似乎是個字符串 DP。
Codeforces Round #702 (Div. 3)
A. Dense Array
在兩個不滿足條件的相鄰的數之間插入若干個就好了。
B. Balanced Remainders
考慮每個數對 \(3\) 取模的值。分別找到 \(0\),\(1\),\(2\) 的個數,把大於平均數的轉化。
C. Sum of Cubes
用 map 記錄哪些數是三次方數。暴力枚舉 \(a\) ,求出 \(x-a^3\) 觀察其是否是三次方數。
D. Permutation Transformation
遞歸模擬。
E. Accidental Victory
按照能力值排序,求前綴和。觀察每個人能否打過他前面所有人加起來的和。從后往前找到第一個不滿足這個條件的人,那么后面所有人都是可行的。最后不要忘記按 \(id\) 輸出。
F. Equalize the Array
計算出每個數出現的次數。枚舉最后的次數 \(x\),把次數小於 \(x\) 的全部刪掉,大於 \(x\) 的刪掉使得他保留為 \(x\)。似乎需要前綴和。
G. Old Floppy Drive
如果轉一圈后加的值是個負數,那就只能轉一圈不到。如果不行的話直接 \(-1\)。
如果轉一圈后加的值是個正數,那一定是可行的。計算出要轉幾圈,然后可以二分一下。
Codeforces Round #703 (Div. 2)
A. Shifting Stacks
對於第 \(i\) 個位置,如果前面所有積木堆在一起能堆到 \(i-1\) 個就是可行的。
B. Eastern Exhibition
根據初一數學容易發現將 \(x,y\) 分開后,\(x_{ans}\)
應該取 \(x\) 的中位數。如果有兩個中位數那么取在它們之間都可以。
C1. Guessing the Greatest (easy version)
考慮答案在區間 \([l,r]\) 中,那么我們先查詢 \([l,r]\) 的次小值,再查 \([l,mid]\) 和 \([mid+1,r]\)。哪個區間的次小值還是原區間的次小值,那么答案就在哪個區間內。容易發現大概是 \(2\times log_2^n\) 次。
C2. Guessing the Greatest (hard version)
考慮優化 C1 的算法。我們考慮先取出這個序列的次小值位置 \(u\)。考慮答案在區間 \([l,r]\) 中,我們扔掉“先查詢 \([l,r]\) 的次小值”這個操作,利用 \(u\)。如果 \(u\) 在此區間中,查詢 \([l,mid]\) 或 \([mid+1,r]\) 使得這個查詢區間包含 \(u\);否則如果 \(u\) 在 \(l\) 左邊,查詢 \([u,mid]\) 即可,在 \(r\) 右邊也同理。這樣我們發現用一次操作就可以把區間縮小一半。
D. Max Median
二分答案 \(x\),判斷 \(≥x\) 的解是否可行。把大於等於 \(x\) 的數替換成 \(1\),其他數替換成 \(-1\)。那么一段中位數至少是 \(x\) 轉換為了這段的和是正的。所以查找新序列中有沒有一個長度至少是 \(k\) 的子串滿足和為正即可。這個問題可以使用前綴和,維護前綴和的前綴最小值,在線性時間內完成。所以總復雜度是 \(O(n\log n)\) 的。
E. Paired Payment
建圖套路題。考慮以下建圖方式:
- 對於一個點 \(u\) 以及一條連接 \(u\) 的邊 \((u,v,w)\),建立虛點 \((u,w)\)。
- 對於一條邊 \((u,v,w)\),我們建權值為 \(0\) 的邊 \(u\to (v,w)\)。
- 對於一條邊 \((u,v,w)\) 和一個虛點 \((u,x)\),建立權值為 \((x+w)^2\) 的邊 \((u,x)\to v\)。
怎么理解這個建圖方式呢?我們考慮任意一條形如 \(x\to y\to z\) 的路徑(我們把 \(y\) 叫做中轉點) \(w_1\),\(y \to z\) 權值 \(w_2\)。根據操作 2,\(x\) 向 \((y,w_1)\) 建立了權值為 \(0\) 的邊。又根據操作 3,\((y,w_1)\) 向 \(z\) 建立了權值為 \((w_1+w_2)^2\) 的邊。這樣就可以實現了。可以理解為中轉點 \(y\) 本身是不經過的,經過的是建立在 \(y\) 上的虛點。其實也不難理解,個人感覺有點類似分層圖最短路的思想。
接下來用 dijkstra 跑最短路即可。考慮這個建圖方式的復雜度正確性:
- 操作 1 中虛點個數是 \(O(m)\)。
- 操作 2 中邊個數是 \(O(m)\)。
- 操作 3 中邊個數是 \(O(m\times \max W)\)。因為如果某個頂點的度數為 \(t\),我們將創建不超過 \(t \max W\)的邊,並且所有 \(t\) 的總和為 \(2\times m\)。