Good Bye 2019


總結

# 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), b(0,1), c(1,0), d(1,1) \]

其中選擇的原點為 \(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 去點,都是線性復雜度


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM