A
Tag:貪心猜想段的長度只會有$1$和$2$(感性理解,應該可以反證……),然后就可以DP/貪心了
B
Tag:貪心、組合考慮如何構造合法方案。從右往左考慮球,因為當前球的位置相比於其他未考慮的球靠右,所以它要盡可能產生負貢獻(成為三元組的$a$),否則盡可能產生$0$貢獻(成為三元組的$b$)。
產生負貢獻的條件是存在其他兩種顏色的球構成的二元組,產生$0$貢獻的條件是存在一種其他顏色未組成二元組的球。在產生$0$貢獻時當前球可以選擇一個未組成二元組的球形成二元組,此時對答案有"未形成二元組數量的球"的貢獻;而產生負貢獻時則對答案有“二元組數量”的貢獻。
將所有貢獻乘起來再乘上$N!$就是答案。
C
Tag:構造考慮最后一次操作,因為操作是將數字變為當前數字和相鄰數字之和,而數都是正的,所以最后一次操作的結果一定會比相鄰兩個數要大。
所以考慮倒着做,每一次選擇當前$B$序列中不滿足$A_x = B_x$的最大值位置$x$,它一定滿足比相鄰兩個位置的值之和大,否則無解。找到這個位置之后我們認為最后若干次操作在$x$上進行,然后進行若干次逆操作直到$A_x = B_x$或者$B_x < B_{x+1}+B_{x-1}$。這么做下去如果發現存在$A_x > B_x$則無解,否則統計逆操作次數即為答案。
D
Tag:構造、二分圖匹配題目等價於:設$b_{i,j} = \lfloor\frac{a_{i,j} - 1}{M} \rfloor$,需要重排行使得$b$的每一列是一個$0$到$N-1$的排列。
不難證明將某一列安排為$0$到$N-1$的排列之后刪去這一列,剩余的$b_{i,j}$矩陣也有解。所以我們按列去做。不難發現這是一個行和數字的匹配問題,Dinic/匈牙利即可構造出一種方案。
最后我們按照$b_{i,j}$的順序排列$a_{i,j}$就可以得到第一次輸出的矩陣,然后按照$b_{i,j}$從小到大對列進行排序即可得到第二次輸出的矩陣。
E
Tag:貪心考慮初始的$S$中字典序最小的字符$x$。我們希望$x$在開頭出現得盡可能多。
設初始的$S+rev(S)$中最長的$x$連續段長度$L$,則最后的串的前綴$x$長度一定可以構造為$\min\{N , 2^{K-1}L\}$,因為我們可以將$S+rev(S)$的$L$個連續的$x$放在$S'$末尾,就可以每一次倍長$x$連續段長度,最后把這個連續段放在$S'$的最前面即可。
對於$2^{K-1}L \geq N$的情況直接輸出$N$個$x$,否則枚舉所有可能的$S+rev(S)$的子串,可以$O(N)$得到進行上述做法之后得到的串。因為有$O(N)$個這樣的子串,所以復雜度是$O(N^2)$的。
F
Tag:構造我們稱一個串$S$是好的當且僅當存在$k$滿足:$S$滿足$(k,l)$。我們先考慮判斷一個串$S$是否是好的。考慮如下做法:
1、如果串長為$1$那么一定滿足;如果串中只存在一種數字,則串$S$是好的當且僅當$|S| \geq L$;
2、否則考慮其中的最小值$min$,並設$S$中下標在$[l_1,r_1]\cup[l_2,r_2] \cup ... \cup [l_k,r_k](\forall i \in [2,k] , r_i > l_i + 1)$內的所有位置的值均為$min$。
3、考慮其中所有的區間$[l_i,r_i]$,如果$r_i - l_i + 1 < L$則$S$不是好的,否則將$[l_i,r_i]$的$min$替換為$\lfloor \frac{r_i - l_i + 1}{L} \rfloor$個$min + 1$,然后回到操作$1$。
對於操作3的正確性可以這樣理解:對於區間$[l_i,r_i]$,在接下來划分的過程當中,這個區間划分出來的所有子區間長度至少為$L$,否則當做到$(min+1,L)$的時候當前串是不好的。所以這$r_i - l_i + 1$個$min$可以等價為$\lfloor \frac{r_i - l_i + 1}{L} \rfloor$個$min + 1$。用$set$維護整個序列,不難得到序列中出現過的數的總數是$O(n)$級別的,所以復雜度為$O(nlogn)$。
然后考慮原問題。不妨拓展整個問題,變為:有兩個長度為$|S|$的數組$L_i , R_i$,你需要求出$\sum\limits_i \sum\limits_j L_iR_j [S_{i,j}\ is\ good]$。原問題顯然是拓展問題的$L_i = R_i = 1$的情況。對於這個問題,與上面的做法類似:
1、如果串中只存在一種數字,可以前綴和$O(n)$計算答案;
2、否則考慮其中的最小值$min$,並設$S$中下標在$[l_1,r_1]\cup[l_2,r_2] \cup ... \cup [l_k,r_k](\forall i \in [2,k] , r_i > l_i + 1)$內的所有位置的值均為$min$。
3、考慮其中所有的區間$[l_i,r_i]$,計算左右端點在$[l_i,r_i]$內的答案,並將$[l_i,r_i]$內的所有$min$替換為$\lfloor \frac{r_i - l_i + 1}{L} \rfloor$個$min + 1$,更新$LR$數組,然后回到操作$1$。
問題是如何更新$LR$數組。我們舉題解中的例子來解釋(因為真的不好直接講啊QAQ):
考慮序列$1\ 1\ 1\ 1\ 1\ 1\ 1\ 1\ 1\ a\ b\ c\ d\ e$,其中$a,b,c,d,e>1$,$L=3,min=1$。那么接下來序列會縮成$2\ 2\ 2\ a\ b\ c\ d\ e$。考慮新序列的串$2\ 2\ a\ b\ c$,它可以對應原序列中$\underbrace{1\ 1\ ...\ 1}_{6 \sim 8\text{個}1}\ a\ b\ c$,因為這樣的串可以通過上述操作變為$2\ 2\ a\ b\ c$。這意味着$L'_2 = L_2 + L_3 + L_4$。其余的$LR$是類似的。
總復雜度和上面一樣是$O(nlogn)$的。有一些細節:1、對於3操作中新加入的數字段,需要把左右端點在這個數字段內的貢獻減掉避免重復;2、注意$r_i - l_i + 1 < L$的情況,可以認為在序列中插入了一個分隔符,稍微需要一些操作。實際上只要把這一段放在這里不管就可以了,因為在之后的過程中也不會考慮到這些段,所以放在這里就相當於一個分隔符。