CF1979 記錄

eastcloud發表於2024-06-07

Dashboard - Codeforces Round 951 (Div. 2) - Codeforces

吐槽和簡單總結

感覺最近打一場比賽掉一次 rating,可能前幾次上漲都只是運氣好碰到了一些更考驗思維的題,我的細節能力就是依託答辯,什麼也寫不出來,這次 B 猜的結論(雖然細想很快就能找到證明),C 也是猜的,D 一直在繞彎,E 一開始還編的是一直偏序的若干 log 解法。

我也不知道賽場上我在急什麼,總之就是什麼也想不到什麼也做不出來,可能思維還是有點亂,需要冷靜下來仔細思考,不要把 div2 當成搶時間大賽,往往適得其反。

還發現我的程式碼能力也是弱得離譜,現在感覺有需要比賽完看看別人的實現,我總是能把很簡單的東西寫的非常複雜。還得了解一點語法糖。

CF1979A

簡單題,不講。

CF1979B

給出兩個無窮序列 \(a_n\)\(b_n\) ,其中 \(a_i = x \oplus i\)\(b_i=y \oplus i\),你需要求出兩個序列的最長公共字串長度。

賽時直接猜的二進位制下字首公共部分長度那麼大,其實證明是很顯然的,你考慮按照字首長度分塊,然後每個塊裡討論,每個塊裡都是一樣的,塊序不同。

CF1979C

構造一個序列 \(a_n\) 使得對於任意 \(i\) 都有 \(k_ia_i > \sum a_i\)\(k\) 陣列給定。

賽時想的是我只要直接 \(\text{lcm}\) 構造,但是這是很不嚴謹的,現在嚴謹地證明一下:

考察一個使上面式子成立的 \(S=\sum k_ia_i\),那麼我們相當於必須有 \(\sum \frac{S}{a_i} < S\),因為按比例分配肯定最優,兩邊約掉 \(S\) 發現這個成立性不依賴 \(S\),那其實只要去 \(\text{lcm}\) 然後判斷一下就行。

CF1979D

給定一個字串,定義字串 \(s\)\(p\) 好的當且僅當 \(s_1=s_2=\cdots =s_p\) 且任意 \(i \leq n-p\) 都有 \(s_i \neq s_{i+p}\),現在你必須對字串做一次操作:反轉一個字首然後接到後面,問怎麼操作能讓字串變成 \(p\) 好的,\(p\) 給定。

這個題的關鍵可能就是你不能一直想分討一些情況簡化條件,而是你要想我們先就硬做,不滿足會怎麼樣。

一個不難發現的點是這其實等價於我把一個字尾 reverse 然後判斷是不是 \(p\) 好,然後你先嚐試從第一個字元往前走,看看不操作到哪裡會變得不好。

接著你會發現這個點如果不是某個連續相同塊的開頭,那麼你只可能把它所標誌的字首做上述操作,否則你還得看一下後面少了多少個類似的字元,然後相匹配地進行操作,只要這兩個分討論就可以結束。賽時在第二個討論那裡調了很久,還是細節能力不夠

CF1979E

給定平面上 \(n\) 個點,曼哈頓距離為 \(|x_i-x_j|+|y_i-y_j|\),找出三個點使得兩兩距離都是 \(d\),其中 \(d\) 是偶數。

往偏序想你就甲烷了,思考一些更簡單的東西,一個套路是先嚐試固定一個點,然後找另外兩個點,不難發現合法的範圍類似一個菱形,第三個點則是兩個菱形的焦點。

注意到一個簡化的性質是必然有兩個點使得 \(|x_i-x_j|=|y_i-y_j|\),然後你把這樣的數對稱作斜線,那麼你只要考慮一個點右上方是否有這樣的斜線就行,但是要每次反轉座標軸,這樣可以減少討論,每次反轉而不是討論。

CF1979F

給定一個 \(n\) 個點的無向完全圖,但是其中少了 \(n-2\) 條邊,你每次可以詢問一個 \(d\) 表示問度數大於等於 \(d\) 的最小度數最小編號的節點,還會告訴你一個最小編號的不和上面那個點有邊相連的點,沒有則返回 0,每次詢問結束刪除第一個返回的點,你需要回答這個圖的一個哈密頓路。

圖很密,很容易有解,有的度很多的點怎麼樣都有解,其實可以直接刪掉。

考察每次把一個恰當多度數的節點刪掉遞迴,不難發現圖中肯定有度數大於等於 \(n-2\) 的點,每次問 \(n-2\),如果有度數是 \(n-2\) 而不是 \(n-1\) 的點,那你完全可以遞迴,然後把它接在新路徑的前面或者後面,這個根據你對那個點沒邊來討論。

否則如果是 \(n-1\),你發現刪掉後圖的性質就不好了,於是你考慮刪掉一個度數小於等於 \(n-3\) 的點補上,遞迴也是容易的,你只要在新的路徑前面分別加上 \(n-1\) 度和另外一個點就好了。