Codeforces Round 951 (Div. 2)

HL_ZZP發表於2024-06-08

A題沒什麼好說的。

B題目讀懂了基本就會了。
首先很明顯,如果x和y的某一位不一樣,那這兩位異或同一個數字自然也是不一樣的。
所以要做的就是找到二進位制裡面最長的連續相同的數量。
這個時候看看樣例,1 4 8 全是2的整數次方,33554432,計算器算一下,發現居然也是。那就非常明顯了。
直接從低位向高位,一位一位的找是否相同,這一位相同就繼續找下一位,如果不同就退出。
找到最多幾位相同,設為\(ans\)\(2^{ans}\)就是答案。

C題做起來就更炸裂了。\(n\leq 50\) , $k\leq 20 $
看看樣例,發現7,9,13,17,5,2,3這種數字出現的比例有點高,盲猜一手答案和質數相關。
20以下的質數最大19 。
嘗試先摸一下貪心,做cf題日常貪心起手。
發現倍率大的肯定要壓的少。
那就考慮一個做法,最大的位置先欽定為壓一塊錢,然後去填寫下一位。如果超過了這一位的承受能力,就回來給他加上錢。
很明顯會T,而且無解的情況需要再推導。
但是這個某種程度上給出了這個形成的思路。
首先5個5是做不到的,而2個3是能夠做到的。
而為什麼第一個做不到,因為收益率總是無法覆蓋付出。而是否存在一種最優分配方案呢。對於上面說的兩種,就存在,全填1 。
看看樣例。發現似乎所有的填寫都和最大公倍數是強相關的。
mmsd,不就是最大公倍數嗎。先按照最大公倍數填,如果做不到覆蓋,就是無解。樣例過了。ac了。
抽象。

想想怎麼證明,其實思路就是那個最優策略的存在性。
要寫式子證明。。大體的思路就是先假設最優解就是讓所有的點在贏的時候得到的回報是一個相同的數字,然後論證這個相同的數字小於你的支出的時候,不管如何調整,總是無法達到答案要求。如何就證明了上面的這個最大公倍數的解法是正確的。
我懶得寫。awa

D題,其實巨簡單。。簡單的有點無聊。
題目給的限制太嚴格了。其實每次能夠調整的只有中間的一個部分和尾部。
\(x\)表示字串尾部相同的字元數量。
\(x=k\)的時候,前面的部分可以擷取一個長度為\(2k\)連續相同的串的中間。或者這個串本身就是完美的。
\(x<k\)的時候,需要找到前面的一個連續相同,並且字元和這個相同的位置,且長度為\(k-x\)或者\(2k-x\),擷取過來。
\(x>k\)的時候,無解了。

總體就3種情況。這題。。噁心歸噁心,但是不得不說確實很考驗分類討論的能力,和程式碼的思路構建。如果不是按照這個辦法構建思路,可能會程式碼寫的很噁心。

唉。要是寫的快,能rank100 。然後我rank1000 。難繃。

5題確實是一個大瓶頸啊。

E題,很有意思。

賽時沒時間寫了,考慮了一下。主要還是賽後想的。
曼哈頓距離相同,是在一個豎著的正方形上的。這個正方形的邊長是\(d+1\)
然後先欽定一個點在三角形上,另一個點也必須在他的矩形上。
畫出這兩個矩形的交點。發現只有兩個點!😋

但是又什麼用呢?\(O(n^2)\)不說,要什麼樣快速判斷那兩個點是否存在呢?
其實可以做,先把每個點按照\(x+y\)排序,然後第二關鍵字\(x\)排序,這樣就可以兩次二分查詢到是否存在了。
但是\(O(n^2)\)還是無法接受。
發現其實這個n方里面有大量的冗餘的列舉。觀察我們花的那兩個正方形,發現其實這個曼哈頓三角形裡面必定有兩個點是在一條斜率為\(+1\)或者\(-1\)的直線上的。那我們就先列舉這兩個點之一的點,然後直接計算出另一個點。這樣還有一個點,再觀察一下那兩個正方形,發現如果確定了這兩個點,另一個點就必定再一個斜率為\(+1\)或者\(-1\)的線段上,而我們要做的就是二分查詢這個的存在性。還是一樣的,按照\(x+y\)第一關鍵字,\(x\)第二關鍵字排序。就可以二分找到了。總體\(O(nlogn)\)

相關文章