我頹了一個周末,因為我已經退役了。
正在周末快結束的時候,我突然感覺我不能就這么退役,所以我迅速地開了一場 vp——
然后做了個 A
題去吃中飯了。
回來補題的時候發現我的排名竟然有 Div.1 的 \(200\) 名,開始意識到了這是個毒瘤場。
CF878A Short Program
好題!對於每一位考慮,發現最后有 \(4\) 種情況:
是 \(0\),是 \(1\),與原來相同,與原來不同。
找到每個位的情況,然后用 \(3\) 次操作一並完成即可。
CF878B Teams Formation
毒瘤題!這是一道 mifafaovo
場上不會做的黃題 /qiang
。
題目意思是有一個長度為 \(n\) 的序列,重復寫 \(m\) 次,每遇到連續 \(k\) 個相同的數就消掉,問最后剩多少個數。
先不考慮有多個,先消掉一個內部的:維護一個棧,每次加進來的數,如果和棧頂元素相同,就讓棧頂值 \(+1\)。
如果棧頂值到 \(k\) 了,就把棧頂元素消掉。如果新數和棧頂不同,就在棧頂新加一個元素。
然后考慮兩個序列直接消,用序列的頭和尾消模擬。
如果頭尾元素相同,值相加,如果 \(\ge k\) 消掉。
如果消掉以后還有剩余,那么消不下去了,直接返回答案。
否則一直消,一直消……最后如果還留下來,那么肯定棧里只有一個元素了。
如果所有這種元素 \(m\) 組連起來能是 \(k\) 的倍數,那么答案為 \(0\),因為全序列兩端能以同樣的方式消掉。
否則兩端會留着,中間會留下剩余。
CF878C Tournament
神題!就是動態加 oier
,每次問有多少個沒有被完全單調隊列的。
有一種好的理解方式是,把每個 oier
看成一個點。
如果一個 oier
在某個方面可以吊打另外一個 oier
,那么連一條有向邊。
然后把這個圖縮點,可以得到一個拓撲圖,圖中存在一條鏈,等同於拓撲序,且拓撲序固定。
考慮表示一個縮點,只需要記錄每個運動的最小值和最大值。那么每個縮點應該是完全吊打比它蒻的縮點的。
答案是最強的縮點的點數。
考慮維護一棵平衡樹,每個節點是一個縮點。
每次新加一個節點,就把所有可以和它作為一個縮點的點刪掉,然后合並到自己上,再放回去。
同時維護每個縮點內的 oier
數量。
這東西可以利用高超的重載運算符加 set
解決。
CF878D Magic Breeding
或許是套路題,不太懂的錳鋅被這題搞暈了,黑紅名不是人,場上竟然一堆做出來……
對 \(k\) 狀壓:設 \(f(i,s)\) 表示對於每個屬性,\(s\) 中是否一定存在一個 \(\ge i\) 且與 \(i\) 相關的。
初始化 \(0\le i\le k,i\in s:f(i,s)=1\),因為只有這些能產生貢獻???
對於一個取 \(\max\) 的新生物,只要兩個先輩的 \(f(i,s)\) 中有一個 \(=1\) 就 \(=1\)。
對於一個取 \(\min\) 的新生物,只要兩個先輩的 \(f(i,s)\) 必須都要 \(=1\) 才 \(=1\)。
所以用一個 bitset
維護這個元素為集合的集合,\(\max\to {\rm or}\),\(\min\to {\rm and}\)。
然后統計答案的時候,對於這個屬性,從大到小枚舉來源,如果所有比當前來源這個屬性大的來源構成的集合存在大於當前生物且與當前生物相關的,這個來源就是答案。
比如兩個集合並了,那么大的會被先枚舉到,然后它就是答案。
比如兩個集合交了,那么小的會先被枚舉到,然后它就是答案。
有點玄學,多手玩多感性理解把。
CF878E Numbers on the blackboard
假設對全局求最值,每個數對答案的貢獻是 \(2^{k_i}\)。
那么只要滿足 \(k_0=0\),\(i>0:k_i>0\),\(k_i\le k_{i-1}+1\) 就是合法的。
然后就不會了。發現最后 \(k\) 分成多段從 \(1\) 上升的上升子序列是最優的,那么可以先分好再查詢。
如果一個數是負的就自己一段,否則往前並,如果又轉正,再往前並。用並查集維護。
然后每次查詢可以維護一個前綴和即可。
不,這是錯的,很可能對於當前右邊界兩個塊沒有合並,但是最后並了。
所以要把詢問掛到右端點上。然后由於塊不會分裂,所以可以動態維護另一個前綴和。
關於權值的爆 int
處理:設 \(W=2\times 10^9+1\)。
只需要判斷是否 \(\ge W\),如果 \(\ge W\) 就變成 \(W\)。
因為前面所有負數映射到這位的和不會超過 \(-2\times 10^9\)。
而且不會有兩個負塊合並,所以一個塊不會小於 \(-10^9\)。
調這題把我智降得絕對值變大了好多 /kk
。