Codeforces Round #953 (Div.2)

lingfunny發表於2024-06-21

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))\),其實還有個反阿克曼函式,此處當作常數。

相關文章