Codeforces Round #953 (Div.2)
# | Who | = | * | A 500 | B 750 | C 1250 | D 1500 | E 2000 | F 2500 | Π | Δ Final | ⮭ |
---|---|---|---|---|---|---|---|---|---|---|---|---|
774 | Iingfunny | 3668 | 492 00:04 |
729 00:07 |
1145 00:21 |
1302 00:33 |
1929 | +427 | N/C |
記號約定:\(a/b=\frac{a}{b}\)。
bilibili
1978A Submission
觀察性質題,注意到最後一個必選,前面的任意選。
時間複雜度 \(\Theta(n)\)。
1978B Submission
直接構造題,對於第二種賣法在 \(b-k \ge a\) 的時候都是第二種更優。
時間複雜度 \(\Theta(1)\)。
1978C Submission
考察對排列的理解。首先是距離最大的時候應該是 \(i>n/2\) 的數在左半部分, \(i<n/2\) 的數在右半部分。判定問題透過對稱性可知道限制條件為偶數,於是令 \(k\gets k/2\)。
接下來考慮構造,最樸素的是隻考慮交換 \(i\) 和 \(n-i+1\),貢獻為 \(n - 2i + 1\) 於是變成用所有奇數或者所有偶數構造出 \(k\)。
可以發現這個在偶數的時候大機率構造不出來 \(k\),考慮新增一些別的交換,但是一個交換必須在有特殊限制的條件下才比較好考慮其貢獻,比如完全有序的情況下,交換 \((i, j)\) 產生 \(j - i\) 的貢獻。
考慮在之前的基礎上構造,對於某次 \(i\) 和 \(n - i + 1\),如果此時產生的貢獻大於 \(k\),就交換 \((i, i + k)\),於是得到正解。
時間複雜度 \(O(n)\)。
1978D Submission
分類討論題。從簡單的情況開始考慮:只有一號,此時分類討論兩種 \(a_1 + c \ge \max\) 和 \(a_1 + c < \max\)。
類似的,考慮 \(i\) 號,此時 \(\max = \max\{a_1+ c, a_2, \cdots, a_{i-1},a_{i+1},\cdots,a_n\}\),分別判斷大於小於和等於。
時間複雜度 \(\Theta(n)\)。
1978E Submission
看起來不像是特殊資料結構題,並且只有查詢。
先手玩一下小情況,不難感覺到修改是有限的,而且可以只先做操作 1,最後再做操作 2。
透過有限這一性質,不難想到莫隊。其次,左右端點向內縮的時候有點難想,考慮使用回滾莫隊,但是要注意:
- 做操作 2 的時候,不能直接修改 \(a\) 陣列導致操作 1 誤判,只能打標記。
隨後閱讀了一下官方題解:考慮到查詢整個串和查詢某個區間的差別只在於邊界的兩個字元,嘗試硬討論這邊界的兩個字元即可。提交記錄是官方做法,但是多判斷了幾個字元。
時間複雜度 \(O(n)\)。
1978F Submission
首先透過性質簡化題意,由 \(k\ge 2\) 注意到,和主對角線平行的線上的點都是聯通的(\(1\) 除外,但是 \(1\) 不可能和其他形成連通塊,於是可以直接不討論了)。
於是你把主對角線拉出來,得到一個序列 \(\{a_2, a_3, \cdots, a_n, a_1, a_2, \cdots, a_n\}\)。於是問題簡化為在序列上的兩個點連邊,問最後有幾個連通塊。而連邊的限制是:
- \(\gcd(a_i, a_j) > 1\)
- \(\lvert j - i\rvert \le k\)
遇到 \(\gcd\) 問題不妨從素數冪考慮,這裡只需要考慮素數。對於某個素數 \(p\),我們可以找到有哪些數字含有這個質因子,於是你得到了一些不(一定)連續的位置,要在它們距離 \(\le k\) 的點之間連一條邊。不過這題是求連通塊數量,於是圖可以拉成一棵從左到右的、線性的樹,只在相鄰兩個點距離 \(\le k\) 時連線。
再次利用這個性質,不用顯式建圖,只需要用並查集維護連通性即可。
至於找出有哪些位置含有質因子 \(p\),可以埃氏篩預處理出每個正整數的質因子,時間複雜度 \(\Theta(n\log\log n)\)。然後在序列中直接遍歷質因子即可,時間複雜度 \(O(n\omega(n))\)。
總時間複雜度 \(O(n\omega(n))\),其實還有個反阿克曼函式,此處當作常數。