1. 程式人生 > 其它 >Codeforces Round #743 比賽記錄(vp)

Codeforces Round #743 比賽記錄(vp)

賽時:ABCD

賽後:ABCDE

題解

A,B倆沙比題

C: 考慮使用拓撲排序計算每個章節是哪一輪被理解的。對於一個依賴關係 \(u\to v\) (表示 \(v\) 依賴 \(v\)),設 \(u\) 在第 \(t\) 輪被理解。如果 \(u<v\),那麼 \(v\) 被理解的輪數至少為 \(t\)。但如果 \(u>v\),那 \(v\) 被理解的輪數就至少是 \(t+1\) 了,因為它是再也沒可能在同一輪中被理解了。

因此,設 \(t_i\) 表示 \(i\) 被理解的輪數。有:

\[t_u= \begin{cases} t_p & (p<u) \\ t_p+1 (p>u) \end{cases} \]

這樣,拓撲排序隨便做。

D:首先,注意到:\(n\) 位置的值,只可能是字尾奇數若干個東西的異或。我們看看長度為奇數的字尾裡,有沒有異或和為 \(0\) 的。如果沒有,就gg。

否則,設 \(p\) 滿足 \(n-p+1\) 為奇數,且 \([p,n]\) 異或和為 \(0\)。首先,我們讓 \([p,n]\) 區間都變成 \(0\)。發現,每個兩個操作一下,就能讓 \(n\) 位置為 \(0\),且前面連續相鄰的兩個,都是一樣的。

即,.... aa bb cc ... xx 0 的形式。aa 表示相鄰兩個一樣的數,bb,cc 同理。然後這邊我們可以用 \(\dfrac{n-p}{2}\) 步,讓它們都變成 \(0\)

對於前面,我們可以先用一步把兩個變成一樣,然後再做一步,把兩個一樣的變成 \(0\)

。這樣,兩步做兩個,總體上是對的。

但是最後可能剩下 \(1,2\) 位置不太對,要判一下。

E:顯然可以 \(n^3\) 區間dp。

腦子一轉,一定有那麼一個最優解的顏色是取在區間兩端的。左/右均可。為啥呢?假設它沒取到端點,那端點的顏色肯定被動過。我們把動它的那次,去掉。然後最後一步的時候,可能除了這個端點之外,還有一大塊,我們把省下的這個操作,去做那個大塊。然後區間顏色還是一樣,操作次數一樣,而顏色就變成了端點的顏色。

處理掉端點處一長段連續相同的情況。然後,\(f(l,r)=\max\{f(l,k)+f(k+1,r),\ k\in[l,r)\}\)

再注意到,這個 \(k\) 的顏色一定和 \(r\)

一樣,做完了。或者說,和 \(r\) 一樣,一定能取到最優解。

為啥呢?假設 \(k,r\) 一樣。由於我們處理掉了一長段連續相同,那隻需要考慮中間那些不一樣的情況。中間那些不同的地方,怎麼也得先做掉,才能再連上 \(k,r\)。因此,\(k,r\) 一定會先處在一個斷開的狀態。我們直接用這兩個dp拼起來的方法做,就是這種方案的答案了。

因此,我們記一下pre,k不斷跳pre轉移。由於相同顏色數只有20種,複雜度是 \(O(20\times n^2)\),就能過了。

實況&總結

最近不知道得了什麼病,打程式碼的手感下降了,感覺鍵盤不是我自己的一樣。

3min秒了A,但是B開始就出鍋了。B的鍋小,修了10min修好了,稍微有些緊張,還交錯題交到A上去了qaq

為什麼做不到打完碼就能A呢?

做C題的時候家裡來了個查煤氣表的,並沒有太大影響,我是拿著草稿本出去接待他的(

然後我就想到了一個拓撲排序。打完,啪的一下,掛了!WA on 2

暴露一個問題,我拓撲排序打的不熟練,且會打出鍋

此時我就開始慌了,就在猜哪邊出了問題。都沒猜對,貢獻3發WA。

以後先把所有問題都看一遍,減少不必要的WA

慌忙之下開了D。然後我發現這玩意我也會!打完之後,啪的一下,也掛了!WA on 2。

我超!同時掛兩個!真就練心態了唄

那咋整啊。我現在會四個題,但同時有兩個大鍋!我也不能幹啥,總不見得開E吧,再來一個鍋?於是我選擇了對拍

2h比賽對拍,真有你的!

極 限 運 動

存疑:如何增加對拍的速度呢?

然後我拍了1h把C搞定了。那個資料生成器,稍作改動,啪的一下D也拍好了。

此時還剩10min。原本想睡大覺的,一想,我還是繼續做吧!然後就去開E

精神可嘉!但是,你會嗎?

很好,不會。顯然一個 \(n^3\) 的dp是會的,然後我開始猜轉移點。

大方向對了!結論?

我看出來一個性質,最優解一定存在一種,是取在區間的端點上的。

接下來,我猜這個轉移點距離l,r不超過20。沒有得到證明,我純猜,然後猜錯了。再加上我實現的不精細,我當時是TLE的。

多組資料千萬不要memset!都給我for迴圈!

賽後繼續去看了題解,完成了E題。