1.CF1805F2 Survival of the Weakest (hard version)
先對 \(a\) 排序。先想想 F1,可以發現難點在於值域很大,但你發現我們可以把所有數減掉 \(a_1\) ,如果還剩 \(x\) 個操作就把答案加上 \(a_12^x\) 即可。每次一操作完就減,這樣你可以發現序列中的最大值不會增大,這就做完了。
考慮 F2。 猜點結論,我們並不需要一直維護整個序列。設定閥值 \(L\) ,只取 \(a\) 中的一小段字首來維護,並且操作完之後也只保留 \(L\) 這麼長。發現對完了。
想想怎麼證,不妨設 \(a_1=0\) ,若 \(a_2+a_3\le a_L\) ,說明 \(a'_1\) 到 \(a'_L\) 都是不需要 \(a_{L+1}\) 參與的。所以保留是正確的。否則的話至少 \(a'_1\) 到 \(a'_{L-1}\) 不需要 \(a_{L+1}\) 參與,有 \(a'_i=a_{i+1}-a_2\) 。再操作一次後至少前 \(L-2\) 個數是對的,我們有 \(a''_{L-2}\le a'_{L-1}-a'_{2}=a_L-a_2-(a_3-a_2)=a_L-a_3\) 。由於 \(2a_3\geq a_2+a_3>L\) ,則 \(a_L-a_3\le \frac{a_L}{2}\) ,於是 \(2a''_{L-2}\le a_L\) 。我們可以看做有效的部分減少了 \(2\) 。
由於每次減 2 時 \(a_L\) 減半,所以只需要把 \(L\) 約設為 \(2\log V\) 即可。複雜度 \(O(n\log V\log \log V)\) 。
2.hdu5404 Random Inversion Machine
考慮怎麼對一個劃分方案算答案。權值是每段的逆序對的個數的乘積,我們拆成在每個段內選一對數 \(u,v\),來計算對於每一對數都滿足 \(u>v\) 的機率。思考這個機率該怎麼算,如果 \(u,v\) 都不是關鍵位置,那乘上 \(\frac{1}{2}\) 就好了;兩個都是關鍵位置不合法;然後考慮剩下的限制怎麼處理。首先我們不妨直接要求 \(p_{x_1}<p_{x_2}<\dots<p_{x_m}\) ,算完答案後再乘上 \(m!\) 。我們把 \(p_u<p_v\) 的限制看成 \(u\) 連向 \(v\) 的邊。我們知道,若形成了內向樹,那直接用 \(\prod \frac{1}{sz_i}\) 計算即可。考慮剩下的限制,相當於 \(x_i\) 上可能會掛上一個點 \(u\),但邊的方向有可能是 \(x_i\) 指向 \(u\) ,可以把它給容斥掉。為了方便計算,我們分析一下現在 \(\prod \frac{1}{sz_i}\) 的形式,其實就是 \(\frac{1}{sz_{x_m}!}\) 乘上那些被掛了點的 \(x_i\) 對應的 \(sz_{x_i}-1\) 。
現在考慮 dp ,設 \(f_{i,j,k}\) 是 \([1,i]\) 被劃分成 \(j\) 段,且 \([1,i]\) 最後一個關鍵點對應的 \(sz\) 為 \(k\) 的所有方案權值之和,我們不要管 \(\frac{1}{sz_{x_m}!}\) ,最後乘上即可。轉移考慮列舉 \(i,k\) 以及下一個段的末尾 \(r\) ,我們在列舉 \(r\) 的同時更新兩個需要的係數 \(x,y\),最後轉移即 \(xf_{i,j,k}\rightarrow f_{r,j+1,k}\) ,\(yf_{i,j,k+t}\rightarrow f_{r,j+1,k+t+1}\) 。 其中 \(t\) 是 \((i,r]\) 的關鍵點個數。複雜度 \(O(n^4)\) 。
3.hdu5415 CRB and Substrings
考慮建出 sam。對於每個節點,考慮其 endpos 下標相鄰的兩個數 \(x,y\) 。對於 \(i\in (len_{f_u},len_u]\) ,若一個區間 \([l,r]\) 包含了 \([x-i+1,y]\) ,那就會讓其答案減 1。
建出 fail 樹來處理 endpos ,考慮做啟發式合併,你發現所有合併一共只會產生 \(O(n\log n)\) 對不同的相鄰二元組 \((x,y)\) 。我們對每個二元組處理出其第一次出現時對應的 \(len_u\) 和被分開時的 \(len_u\) 即可。考慮每次算答案,我們令 \(a_i\) 是 \([i-k+1,i]\) 的答案,初始 \(a_i=\tbinom{k+1}{2}\) ,然後每個二元組對 \(a\) 的貢獻可以寫成兩段一次函式的形式,容易透過差分處理,這樣就計算出了每個長度為 \(k\) 的子串的本質不同子串個數了。最後要找字典序最小者,透過雜湊+二分算 lcp 來判字典序即可。
4.擬陣交
是這樣一個過程,現在我們在求 \((U,I_1)\) 和 \((U,I_2)\) 的交。
不斷擴充我們的獨立集 \(S\) ,對於 \(x\in S,y\notin S\) ,如果 \(S-x+y\) 在 \(I_1\) 中就連邊 \((x,y)\) ;在 \(I_2\) 中就連邊 \((y,x)\) 。最後看有沒有一條路徑,從 \(y\notin S\) 且滿足 \(S+y\) 在 \(I_1\) 中的點出發,最後走到 \(y\notin S\) 且滿足 \(S+y\) 在 \(I_2\) 中的點。有的話就找一條最短的,把路徑上狀態全部翻轉,否則就結束過程。
出現最多的一類擬陣應該是,\(U\) 是邊,\(I\) 是所有不形成環的邊集。