1. 程式人生 > 其它 >ARC泛做

ARC泛做

ARC139

A. Trailing Zeros

顯然是不斷推出最小的 \(\gt a_{i-1}\) 且符合條件的 \(a_i\)。貪心構造即可。

提交記錄

B. Make N

首先,如果 \(X\times A\le Y\) 那麼花費 \(Y\) 的代價 \(+A\) 是無意義的;花費 \(Z\) 的代價 \(+B\) 同理。

把這些無意義的操作刪掉,則優惠操作可能還有 \(0\)\(1\)\(2\) 種。

\(0\) 種和 \(1\) 種都很 naive。讓我們考慮兩種優惠操作都沒被刪掉的情況。

不妨設 \(A\le B\),那麼當 \(B\ge \sqrt{n}\) 的時候 \(+B\)

的優惠操作使用次數是 \(\le \sqrt{n}\) 的,暴力列舉這個次數,則轉化為了 \(1\) 種優惠操作的情況。

否則,說明 \(A\le B\lt \sqrt{n}\),注意到此時 \(+1\) 的次數是嚴格小於 \(A\) 次的,暴力列舉這個次數 \(c\),則轉化成了解方程 \(Ax+By=n-c\)。顯然取到最優秀的情況時,要麼 \(x\) 最小,要麼 \(y\) 最小(需要保證 \(x,y\) 同時為非負整數)。這是基本的數論知識。因為一次拓展歐幾里得的最壞時間複雜度是 \(O(\log n)\),所以兩部分情況加起來的時間複雜度為 \(O(T\sqrt n log n)\)

提交記錄

ARC140

A. Right String

首先,如果一個串迴圈左移 \(k\) 次後仍等於本身。則應有 \(k\mid n\) 且有迴圈節長度為 \(k\)。而此時,顯然 \(f(S)\) 就是 \(k\)

所以暴力列舉 \(k\mid n\) 嘗試作為最後的答案。然後目標變為用不超過 \(K\) 次的改動使其 \(k\) 個一迴圈。

顯然我們把所有位置按照模 \(k\) 餘數分為 \(k\) 類:\(\{\overline{0},...,\overline{k-1}\}\)。對於一類的所有位置,它們最後必須相同。所以這一類最少需要修改的位置數顯然是總數減去眾數數量。時間複雜度是 \(O(n\times d(n))\)

的,可以解決 \(n\le 2\times 10^5\)

提交記錄

B. Shorten ARC

顯然可以從串中抽取若干個極長的 \(a...arc...c\),其中兩邊的 \(a,c\) 出現次數相等,設為 \(k\ge 1\)

奇數次的操作就是把一個 \(k\) 變為 \(k-1\),如果變成 \(0\) 了就刪掉它。

偶數次的操作就是把一個 \(k\) 直接刪掉。

那麼我們要刪,肯定刪當前最小的那個 \(k\)。所以可以用一個 std::multiset 來維護當前所有的 \(k\),並且貪心取出最小值去操作。

由於操作次數不超過 \(n\),所以時間複雜度為 \(O(n \log n)\)

提交記錄

C. ABS Permutation (LIS ver.)

首先思考不指定第一項的情況下怎麼做。

我們發現對於任何 \(n\),都有兩種最優秀的序列:

  • 如果 \(n\) 是奇數,以 \(n=7\) 為例,可以構造出 4 5 3 6 2 7 14 3 5 2 6 1 7 兩種,都是 \(LIS=n-1\)

  • 如果 \(n\) 是偶數,以 \(n=6\) 為例,可以構造出 3 4 2 5 1 64 3 5 2 6 1 兩種,都是 \(LIS=n-1\)

如果 \(X\) 就等於這裡某個優秀序列的開頭,那麼直接輸出即可。

否則我們隨便找一個優秀序列,然後找到其中 \(X\) 的位置,把它換到最前面去,這樣顯然會有一個 \(LIS=n-3\) 的解。但事實上,我們可以讓 \(LIS\) 始終 \(\ge n-2\)

首先觀察上面的兩種優秀序列,其實長得非常像,只不過是把相鄰的兩項交換了一下而已。不難發現,必定存在一個優秀序列,使得 \(X\) 的位置後面還恰好有偶數個元素。

\(X\) 放到開頭,然後把後面的偶數個元素兩兩交換,不難發現 \(LIS\) 變成了 \(n-2\)

提交記錄

D. One to One

首先不連 \(a_i=-1\) 的邊,經典結論是此時圖只有三種形態:環、樹、基環樹。

環本質上也是基環樹。這兩種情況下肯定是內部 \(n\) 個點的 \(a_i\)\(\neq -1\) 了。只有樹,內部肯定存在一個點 \(a_i=-1\),就是說他還能往外連的。

然後可能是若干個樹串聯起來形成一個環,或者若干個樹串成一條鏈,又放進一個基環樹上去了。畢竟如果 \(a_i=-1\) 全替換掉以後,整張圖肯定都是基環樹的。

你發現第二種情況不用考慮,設初始基環樹有 \(a\) 個,樹有 \(b\) 個,則直接 \(ans+=a\times n^b\) 就行了,每種情況,所有基環樹都作為一個連通塊去新增貢獻。

真正考慮的是若干個樹串成一個環的情況。容易發現只和每顆樹的大小有關,假設樹的大小分別為 \(d_1,d_2,...,d_k\)

由圓排列,有 \((k-1)!\) 種方式把它們串聯起來。每種方式的串聯方案數都是 \(\prod_{i=1}^{k}d_{i}\)

然後做一個 \(n^2\) 的揹包就行了,複雜度是 \(O(n^2)\) 的。事實上可以列出生成函式然後分治 NTT 做到 \(O(n\log^2 n)\)

提交記錄