Codeforces Contest 1827

A. Counting Orders

求有多少種重新排列 \(a\) 的方式,使得對於任意 \(1\le i\le n\),都滿足 \(a_i>b_i\),結果對 \(10^9+7\) 取模。

\(1\le n\le 2\times 10^5,1\le a_i,b_i\le 10^9\),保證 \(a_i\) 互不相同。

經典套路,從大到小考慮每個 \(b_i\),維護一個集合 \(S\) 代表可以放入的 \(a_i\)。容易發現集合大小隻增不減,於是可以每次直接乘上集合大小。複雜度 \(O(n\log n)\)

B2. Range Sorting (Hard Version)

對一個數組 \(\{p_i\}\) 的一段區間 \([l,r]\) 排序的代價爲 \(r-l\) ,對整個數組 \(p_i\) 排序的代價爲選定若干區間並排序,使得整個數組有序的代價之和。

\(\{a_i\}\) 的所有子段排序的代價之和。\(1\le n\le 3\times 10^5,1\le a_i\le 10^9\)

對於一個串的答案是串長-最多能劃分的連續段個數。也就是說對於一個子串 \(a[l:r]\),如果存在 \(i\) 使得 \(\max(a_{l},\dots a_{i})<\min(a_{i+1},\dots,a_r)\) 就會使得答案減一。考慮最經典的做法枚舉 \(\text{arcmax}(a_l\dots a_i)\)。記作 \(p\),找到左邊第一個大於 \(a_p\) 的記作 \(L_p\),右邊同理記作 \(R_p\)。顯然需要 \(i=R_p-1\)。找到 \(R_p\) 之後第一個比 \(a_p\) 小的。可以直接求出答案。複雜度 \(O(n\log n)\)

Bonus:如何做到 \(O(n)\)?對於每個 \(R_p-1\) 維護所有 \(p\),從後往前掃描線加入的順序一定是按照 \(a_p\) 遞增的順序。那麼從後往前掃的時候維護一個單調遞減的棧,按順序彈棧即可(需要將 \(a_p\) 逆序)。這裏正確性是因爲一定存在比起小的數在單調棧中。

C. Palindrome Partition

稱一個字符串是好的,當且僅當它是一個長度爲偶數的迴文串或由若干長度爲偶數的迴文串拼接而成。

給定一個長度爲 \(n\) 的字符串 \(s\),求有多少 \(s\) 的子串是好的。\(1\le n\le5\times10^5\)\(s\) 僅包含小寫字母。

對於一個偶迴文串,如果他有一個偶迴文後綴,那麼他一定可以劃分成更多的偶迴文串。對於每個位置 \(i\),找出最短的以其爲結尾的偶迴文子串,轉移即可。使用迴文自動機可以直接記錄,也可以使用 Manacher 是一個區間賦值的過程。其實是一個取 \(\min\) 的操作,可以單調棧維護。複雜度 \(O(n)\)

D. Two Centroids

給定一棵樹,初始只有 \(1\) 個編號爲 \(1\) 的節點。接下來會做 \(n-1\) 次操作,第 \(i\) 次操作添加一個編號爲 \(i+1\) 的節點,並在節點 \(i+1\)\(p_i\) 之間連邊。

在每一次操作之後,至少需要多做多少次操作(加點加邊),才能使這棵樹具有兩個重心。\(1\le n\le 5\times 10^5\)

假設只有一個重心,顯然是往重心的子樹內不斷添加葉子。設 \(k\) 爲重心的重兒子子樹大小,答案即爲 \(n-2k\)。動態維護重心只需要用 csps2019 樹的重心的套路即可。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章