現在開坑,看看一段時間後我能有多大的進步。
- 程式碼能力:
- 想明白每個維度的上下界,不好做的話,可以嘗試改變寫法。
- 找不到方向:
- 先觀察性質。不好下手處理的題目先進行一些基本的觀察,不要上來就做。
*ARC178D
首先我們發現 mex 要從大往小刪,並且 mex 能被刪掉的條件是,\([0,mex)\) 內的數都在其左側 / 右側。
所以可以 dp,掃值域。\(f(i,l,r)\) 表示 \(0\sim i\) 覆蓋了給定序列上 \([l,r)\) 的範圍。轉移分 \(i+1\) 是否在 \(A\) 中討論。
字首和最佳化即可 \(\mathcal O(n^3)\)。
至於為啥要左閉右開,寫一寫 \([l,r]\) 的寫法就知道了 /mgx。
- 程式碼能力:想明白每個維度的上下界,不好做的話,可以嘗試改變寫法。
ARC177D
WA 了最後兩個點,what can I say?
首先發現,數軸可以分為若干段,段之間互相不影響,可以分開處理。
對於一段,它最終的形態必然是相鄰兩個分別向兩邊倒塌,並且覆蓋了整個區間。
係數根據單調棧計算,然後線段樹 / 掃描線計算即可。
- 先觀察性質。不好下手處理的題目先進行一些基本的觀察,不要上來就做。
*ARC165E
我似乎還是沒有理解這個方法的本質,連續做了這麼多題還是不會用,該總結一下了。
“拒絕取樣” 應用的條件是,對於隨機過程中的隨機事件有一定約束,並且機率只和滿足約束的元素有關。
我們運用 “拒絕取樣” 的核心目的在於,直接將幾乎不可做的問題轉化為可做很多的問題。
本題符合 “拒絕取樣” 的應用條件,我們直接認為,這個過程就是隨機一個排列 \(P\),\(x\) 產生貢獻的條件就是 \(P\) 中在 \(x\) 前面的點全刪掉以後,\(x\) 所在連通塊大小仍 \(>K\)。
其實實質上,這個方法直接揭示了貢獻計算的方法,套路化地簡化了我們的思考。
看完這個我才意識到一個事實:我壓根不用管選上前面點對應的機率,只需要關注選上了哪些點,它對我的連通塊造成了什麼影響就行。
於是 dp。設 \(f(i,j,k)\) 表示 \(i\) 子樹連通塊大小為 \(j\),去掉了 \(k\) 個直接和連通塊相連的點的方案數。
\(\mathcal O(n^4)\),6ms 隨便拿下。
ARC160D
我是搞笑哥。
感覺看完題解以後覺得很典,但自己沒有想出來,這也說明了一定的問題。
首先我們先進行區間減的操作。
這種過程性強的題目,我們可以直接把操作倒過來,變成區間 \(+1\),單點 \(+K\)。
假設 \([i,i+K-1]\) 做了 \(b_i\) 次區間加操作,我們有結論:合法的 \(a\) 和 \(b\) 形成雙射。
其實也比較好理解,\(a\) 到 \(b\) 的對映只需要順序考慮每個位置就可以簡單推出。
然後就是簡單計數。
烏魚了,為啥都發現對映的方式了,就是沒發現是雙射?
總結一下,這類題目的要點:
- 時光倒流。
- 推性質,找判定條件,猜結論,構造雙射。
ARC147D
逆天。
我說,這東西咋做,看起來挺對稱啊,那我直接猜 \(n^m\times m\),然後我死了。
考慮將 \(S_i\) 看作一個二進位制數,每次就是對其進行一次異或,設 \(S_i\) 和 \(S_{i+1}\) 之間不同的元素是 \(p_i\),那麼 \(S_i\) 的狀態可以視作 \(S_1\) 和 \(p_1\sim p_{i-1}\) 的異或和。
固定 \(p\),關注單個元素 \(x\),只需關心其是否在 \(S_1\) 中,根據異或的性質,不管是否在 \(S_1\) 中,它出現的次數總和都是 \(n\)。
於是答案就是 \(n^m\) 乘 \(p\) 的不同個數,顯然是 \(n^m\times m^{n-1}\)。
不好總結,純逆天吧。
*ARC104F
什麼時候能脫離看題解的悲慘命運呢qwq。
我們很熟悉這個過程,這就是笛卡爾樹的構造過程。
而一個笛卡爾樹又唯一對應一個陣列 \(P\),所以 \(P\) 和笛卡爾樹的形態形成雙射。
於是列舉區間最值後區間 dp 即可。
變換視角,造雙射,找子結構,dp。
AT_cf16_final_f
並不是 ARC,但是計數 suki。
強連通圖的分步構建,考慮 ear-decomposition 的 pattern,我們只關注 \(1\) 所在強連通分量的大小和當前正在構建的強連通分量。
設 \(f(i,j,k)\) 表示走了 \(i\) 次,\(i\) 所在強連通分量大小為 \(j\),當前走到了 \(k\) 個還沒加入強連通分量的點。
轉移隨便轉一下吧。\(O(n^3)\)。
哎呦又把 \(10^9+7\) 寫成 \(998244353\) 調一年,這麼喜歡多項式的?
*ARC160F
感覺是很好的題目,找到合適的刻畫方法後就行雲流水。然而我對 01 轉化仍然不熟悉,該好好看看了。
排序的刻畫:
- 逆序對。
- 拓撲序。
- 01 序列轉化。
涉及排序且資訊繁多不好維護的情況下,我們一般會考慮 01 序列轉化,再考慮 01 序列和原序列之間的對應關係。
本題中,將 \(\le x\) 的設為 \(0\),\(>x\) 的設為 \(1\),一個 \(01\) 序列的合法性判定是簡單的。
知道了什麼樣的路徑是合法的後,簡單地進行路徑計數。
然而 \(m\) 很大,不過真正的非平凡 \((a,b)\) 只有 \(O(n^2)\) 對,拿出來處理一下即可。
時間複雜度 \(O(n^32^n)\)。
然而還是看題解了,下次儘量別看吧。
ARC146C
異或線性基的處理手法,見過多少次了怎麼還是不會。
先回顧一下在 \(\{0,1,\dots,2^n - 1\}\) 中選大小為 \(k\) 的線性無關組的方案數:假設當前要選 \(i+1\) 個,前面 \(i\) 個張成的空間大小為 \(2^i\),那麼方案數是 \(2^n-2^i\),於是答案就是 \(\prod\limits_{i=1}^k (2^n-2^{i-1})\),然而無序,除一個 \(k!\)。
性質:大小為偶數的集合之間,對稱差大小亦為偶數。
於是大小為偶數的集合所張成的空間構成了原線性空間的一個子空間。隨便構造一個 \(\{a_1\oplus a_2, a_1\oplus a_3,\dots, a_1\oplus a_{n+1}\}\) 就能表示。
考察這樣的集合的選取方案,第一個隨便選,\(2^n\),而對於 \(i>1\) 的部分,前面只有 \(i-2\) 個線性無關向量,於是張成的空間大小為 \(2^{i-2}\),答案為 \(\sum\limits_{k=0}^{n+1} \frac{1}{k!}\prod\limits_{i=1}^n f_i\)。
又看題解。
*ARC144D
牛魔,好不容易做出了一些自己的思考,後面的標準處理手法又不會。byd 怎麼這麼菜。
不是很懂,這個東西真的是能直接猜出來的嗎,太空步了。
面對一個完全陌生且逆天的東西,what should I do?
直接做沒有辦法找到什麼性質,我們嘗試動用一些常規手段來進行剖析。
考慮增量構造,每次新考慮一位 \(d\),顯然 \([2^d, 2^{d+1}-1]\) 之間的部分是可以獨立考慮的,我們考慮 \([0,2^d-1]\) 和它的關係。也就是 \(a_i+a_{j+2^d}=a_{i\&j}+a_{i|j+2^d}\),我們發現有 \(a_{j+2^d}-a_{i|j+2^d}=a_j-a_{i|j}\),再泛化一下既有 \(a_{j+d}-a_{i+d} = a_{j}-a_i\),於是差分相同。
然後我們又發現,只需要考慮拼接處的差分,剩下的部分直接就滿足了所有限制。太有趣了。
然後考慮 dp。我們只需要關注當前構建出的序列的極差。後面我就不會了。
設 \(f_{d,x}\) 表示當前考慮前 \(d\) 位,極差為 \(x\) 的方案數。轉移 \(f_{d+1,x+i}\gets f_{d,x}\times (1+[i>0])\)。
顯然我們只關心 \([i>0]\) 這個係數的貢獻,事實上是好算的,我們有:
把 \((k-i+1)\) 拆成 \((k+1)\) 和 \((-i)\),交換求和順序,然後上指標求和隨便化一下就好。這個感覺方法很多,本身形式並不是特別複雜。
時間複雜度 \(\mathcal O(n)\)。
變換視角,標準處理。
ARC089F
感覺很 AGC style 而不 ARC 的題,就是一步步拆解吧。
哦我是沙伯,這題並不簡單啊。結構一層套一層,好煩。
我錯了,先不寫這題了嗚嗚。
*ARC132E
?
沒看出來最終答案的形態是固定的,感覺是觀察的方法有一點問題。
首先我們考慮時光倒流,對著第二個樣例手摸一下,容易發現最終答案的形態肯定是 <<<<<====>>>>>
這樣的東西。
然後考慮劃分階段。我們並不需要考慮具體操作了哪一個,因為我們有著明確的構造目標:也就是上面的那個形態。
因此,我們可以這樣涉及狀態:\(f_n\) 表示 \(n\) 個點全都向左,且最終不影響到右邊的方案數。
發現影響到右邊的唯一情況就是第 \(n\) 個點選了向右,去除這種情況以後子結構遞推下去就好了。\(f_n=f_{n-1}(1-\frac{1}{2n})\)。
然後算下答案就行,列舉間隔。
所以在觀察出一些東西前,覺得不可做的話,還是回去看看手摸出來的東西具有怎樣的形態。
ARC104E
一看就感覺是個造雙射題,然而好像並不是。
對於一個方案,我們顯然只需要知道元素間的偏序關係,因為 \(N=6\) 所以很少。
對於每種偏序關係,算出來它的 LIS,再乘上方案數即可。
方案數就是 [APIO2016] 划艇,dp 一下就行。但是拉格朗日插值怎麼寫?
時間複雜度不知道,反正感覺隨便過吧。不推薦,太shaber。
ARC106D
都已經做過多少題了還不熟悉和式的處理,真是shab了。
首先 \(\sum\limits_{i=1}^{n-1}\sum\limits_{j=i+1}^n a_i\) 我們可以拆成 \(((\sum\limits_{i=1}^n a_i)^2-\sum\limits_{i=1}^n a_i^2)/2\),這樣的好處是式子非常對稱,於是有了很好的性質。
然後這個題就做完了,二項式定理拆一拆然後改變求和順序即可。\(\mathcal O(nk)\)。
**ARC106E
終於淘出來了一道 Educational 題。
似乎比較 nb 的話也可以直接看出來這個結論,不需要形式化推導。
嘗試從週期角度直接貪心之類的做法無果,我們考慮使用網路流。
首先二分答案,將每個人拆成 \(K\) 個點,向來了的那些天連邊,然後跑網路流 / 最大匹配即可。
注意到這個題是要求完美匹配,於是我們考慮 Hall 定理。
Hall 定理使用的時候需要注意的是關注哪一側的點,我不太清楚有沒有好的決策方法,我反正是左右兩邊都試試。
對於右側點(每天對應的點),左側點的狀態可以簡單求出,設為 \(S_i\)。那麼最終左側點的狀態是若干 \(S\) 的並。
再換個視角,對於左側點固定狀態,我們希望右側點取的儘量多,這樣限制更嚴。那麼對著 \(S\) 做一個高維字首和再 check 一下即可。時間複雜度 \(\mathcal O(n2^n\log K)\)。
很厲害的題。我自己做的時候直接被第一步卡住了,後面的每一步反而都比較行雲流水。然而這個是有一些東西可以總結的,我們發現週期性的結構進行最最佳化,直接做其實還是挺不容易的。
所以任何時候,最最佳化問題上卡殼,最直接的解決方法就是考慮網路流。
當然這題也有一些表面化的做法,比如直接猜結論之類。不過感受到這種東西可能也離 Hall 定理不遠了。
upd:寫完程式碼發現還有一個細節:[HAOI2015] 按位或 裡面的正難則反技巧。
ARC106F
基礎 Prufer 序列練習題。
但是我一開始式子列錯了,導致後面咋化都做不出來,南瓜。
但這個推式子感覺,不是特別難。大概就畫一畫,湊一個多元範德蒙德卷積。
ARC107D
我真蒙古了啊,我的做法為啥過不去。
我認為直接做可以有一個 \(\mathcal O(nk\log k)\) 的 dp,然而它是錯的,無語。
我們這樣來考慮轉化這個過程:每次選上 \(1\),或者給已經選上的數乘上 \(\frac{1}{2}\)。
不難發現這樣一定正確。和拆分數的 \(n\sqrt n\) 其實很類似。
然後考慮 dp。設 \(dp_{i,j}\) 表示前 \(i\) 個數填出來 \(j\) 的方案數。
轉移就是 \(dp_{i,j}\gets dp_{i-1,j-1}+dp_{i,j\times 2}\)。
所以做出來的關鍵就在於,怎樣看待這個過程。
可能可以看作 “最終局面” 的逆向思路,過程性問題可以導向最終局面,而對於最終局面,我們也可以嘗試改變其構造過程,從而簡化我們的 dp。
ARC107E
純純的shaber題。沒有任何意思。
試了試各種方法都不行,那感覺只能是有周期了唄。
*ARC107F
完全不會一點 flow,所以照著自己的理解給個胡扯:
flow 的一個 trick:轉換貢獻形式。唉是不是所有最最佳化題都可以這樣來著。
我們發現最難受的是絕對值,如果能去掉就好了,我們知道 \(\max(a,b)-\min(a,b)=|a-b|\),那麼設 \(S^+=\sum_{i\in S} [b_i>0]b_i,S^-=\sum_{i\in S}[b_i<0]-b_i\),那麼 \(|S^+-S^-|=\max(S^+,S^-)-\min(S^+,S^-)=S^++S^--2\min(S^+,S^-)\)。
建圖,拆出入點 \((u,u')\),中間連邊 \(a_u+|b_u|\),對於邊 \((u,v)\) 連 \((u',v),(v',u)\),都是 \(+\infty\)。
然後考慮描述連通塊。對於 \(b_u>0\) 連 \(S\to u\),對於 \(b_u<0\) 連 \(u'\to T\)。邊權都是 \(2|b_u|\)。
然後你發現這樣它不可能同時割兩邊,於是就能描述 \(2\min(S^+,S^-)\) 了。