總結
# | Name |
---|---|
A | Card Game standard input/output1 s, 256 MB |
B | Interesting Subarray standard input/output2 s, 256 MB |
C | Make Good standard input/output2 s, 256 MB |
D | Strange Device standard input/output1 s, 256 MB |
E | Divide Points standard input/output1 s, 256 MB |
F | Awesome Substrings standard input/output8 s, 512 MB |
G | Subset with Zero Sum standard input/output2 s, 256 MB |
H | Number of Components standard input/output8 s, 256 MB |
I | Xor on Figures standard input/output5 s, 256 MB |
又是一年goodbye
3小時9個題,有現場賽內味了,雖然碼量仍然符合cf風格,也依然只會寫4個題
當場通過abcd
、賽后通過efg
A 67879420
比較最大值即可
B 67885936
給一個序列,求任意一個子串滿足極差不小於長度
顯然如果有解,必然存在相鄰兩項的極差大於 1
C 67906974
給一個序列,求添加不超過 3 個數字使得 \(a_1 + a_2 + \dots + a_m = 2\cdot(a_1 \oplus a_2 \oplus \dots \oplus a_m)\)
顯然這個序列是無用條件,其實只有異或和以及和是有用條件
相當於求 \(a+x=2\cdot(b \oplus x)\)
或\(a+x+y=2\cdot(b \oplus x \oplus y)\)
考慮如果 \(b\) 為 0,就是求 \(a+x=2 \cdot x\) ,即 \(x=a\) 即可
那么先用一個數使得 \(b\) 變為 0,即輸出 \(b\) 即可
D 67922016
交互題
有一個無相同元素的序列,\(n,k,m\) 分別表示序列長度,詢問區間大小和詢問第 \(m\) 大(升序后第 \(m\) 個位置)
現在你不知道 \(m\) 和序列中任何一個數,可以詢問不超過 \(n\) 次,每次會回答你答案的下標和大小,求 \(m\)
對於前 \(k+1\) 個數字進行詢問,每次去掉其中某一個數字即可,共詢問 \(k\) 次
對於其中最小的數(因為它會回答你數的大小)進行分析
由於沒有比它更小的數,所以它必然是這 \(k+1\) 個數中第 \(m\) 大的數字,那么也就是說這 \(k+1\) 個數中比它小的數的數量為 \(m-1\),比它大的數的數量為 \(k-m+1\),那么有 \(k-m+1\) 次詢問會回答這個數字,所以設它的出現次數為 \(x\),答案為 \(m=k+1-x\)
E 68035235
\(n\) 個二維坐標整點,對其黑白染色,記兩點之間的距離為歐幾里得距離,記 \(set1\) 為黑黑和白白間的距離集合,\(set2\) 為黑白間距離集合,使得 \(set1 \and set2 = \emptyset\) 且 \(set1,set2\) 非空
首先對其中一個點作為坐標原點建系並重新計算坐標
那么可以將點按奇偶分為四類:
其中選擇的原點為 \(a(0,0)\) 類,\(ab,ac,bd,cd\) 類間的距離的平方都為奇數,\(ad,cb,aa,bb,cc,dd\) 間距離平方都為偶數,所以染色為 \(ad\) 為黑色, \(bc\) 為白色即可
- 但是雖然 \(a\) 集合必不為空集,若 \(b,c\) 若都為空集:
- \(aa,dd\) 間距離能被 4 整除 \(ad\) 間距離模 4 為 2,可以將 \(ad\) 染成不同的顏色
- 若 \(d\) 也為空集,考慮將四個集合的坐標再縮小一倍重新求解,必然會出現奇數點
一開始還以為是 \(2-sat\) ,然后寫了寫沒過樣例
F 68040330
給一個 01 序列,求其中滿足串中 1 的數量可以整除串長的子串數量
當子串 \((i+1, r)\) 滿足 \(r - i == k \cdot (pre_r - pre_i)\) 時它是一個合法串,我們設置一個 \(T\)
- 對於 \(1\le k \le T\) 的串
- \(i - pre_i \cdot k == r - pre_r \cdot k\) 所以只需要使用 map 儲存前綴出現的 \(i - pre_i \cdot k\),對於每個 \(r\) 加上它的答案即可,復雜度 \(O(n\cdot T)\)
- 對於 \(T < k\) 的串
- \(pre_r-pre_i=\frac{r-i}{k}\),故 \(pre_r-pre_i \le n/T\),對於每一個起點離散化的計算后 \(n/T\) 個 1 即可,復雜度 \(O(n \cdot \frac{n}{T})\)
若選取 \(T\) 為 \(\sqrt{n}\),整體復雜度為 \(O(n\sqrt{n})\)
注意如果第一部分使用 map 儲存前綴會多出一個 \(log\) 復雜度,可以考慮適當減小 \(T\) 並用數組存儲以減小復雜度
實際上直接開 \(n \cdot \sqrt{n}\) 的數組並不會超過內存,但是達到了 \(9\cdot 10^7\) 的數量級屬實不敢嘗試
使用減小 \(T\) 的方式反而會因為尋址更快達到更優的常數,經測驗直接根號的運行時間 \(5s\) 左右,固定 \(T=150\) 的話運行時間答到了 \(2s\) 。本質不算一個好題,為了防止暴力的 \(O(n^2)\) 解法卡掉了一些常數
G 68036447
給一個序列 \(a\) ,其中每個數都滿足 \(i-n\le a_i\le i-1\)
求一個和為 0 的子序列
這題是真的妙,就是對於每個數可以構造出: \(i \to a_i-i\) 兩者和為 \(a_i\) 然后將 \(a_i-i\) 取反則 \(1 \le i-a_i \le n\) ,若對每個數都建這樣一個單向邊,則形成一張 \(n\) 個點,\(n\) 條邊的圖,必然存在環,環中所有點的和就是 0
求環可以直接 dfs(1) 搜出一個可行解,也可以暴力一點直接 topsort 去點,都是線性復雜度