1. 程式人生 > 其它 >AtCoder 總結

AtCoder 總結

\(\texttt{Contest 100}\)

\(\texttt{Problem C:}\) \(\texttt{*3 or /2}\)

每次操作對長度為 n 的序列裡的每個元素 \(\times 3\)\(\div 2\) ,每次操作至少要一次 \(\div 2\),求最多的運算元

因為 \(\times 3\) 其實對結果沒有影響,所以我們只要數每個數有幾個質因子 \(2\) 再求和即可。

\(\texttt{Problem D:}\) \(\texttt{Patisserie ABC}\)

\(n\) 種蛋糕,有三種屬性:\(a, b, c\),要選 \(m\) 種蛋糕,使得 \(m\)

種蛋糕的每種屬性的絕對值之和最大,問最大是多少

最後組成的可能只有八種: {a, b, c}, {a, b, -c}, {a, -b, c}, {a, -b, -c}, {-a, b, c}, {-a, b, -c}, {-a, -b, c}, {-a, -b, -c}

於是對目標加和是負數的整個序列取反(取絕對值),取 \(\max\) 即是答案。

\(\texttt{Contest 101}\)

\(\texttt{Problem C:}\) \(\texttt{Minimization}\)

一個 \(n\) 的全排列,每次選擇長度為 \(m\) 的子段,把所有元素變成子段中的最小值。求把 \(n\)

個元素變成一樣的操作次數

顯然,最後剩下的所有元素即是序列中的最小值,我們將如何考慮從最小值伸展出去。

\(\texttt{Problem D:}\) \(\texttt{Snuke Numbers}\)

\(\texttt{咕}^{\texttt{咕}_\texttt{咕}}\)?

\(\texttt{Contest 102}\)

\(\texttt{Problem C:}\) \(\texttt{Linear Approximation}\)

選擇一個 \(b\) ,使得 \(\sum\limits_{i=1}^{n}\text{abs}(A_i - (b+i))\) 最小。

可以先處理出 \(A_i - i\)

,進行排序, \(b\) 則是 \(A_i\) 的中位數。

\(\texttt{Problem D:}\) \(\texttt{Equal Cut}\)

把一個長度為 \(n\) 的序列分成 \(4\) 段,使得最大和與最小和之差最小。

先做一遍字首和,前 \(i\) 個值的和標記為 \(sum_i\)

我們用 \(P_1, M, P_2(P_1 < M<P_2)\) 對他們進行分割,四段得出的值則如:

\(val_1 = sum_n - sum_{P_{2}}\)

\(val_2 = sum_{P_{2}} - sum_{Med}\)

\(val_3 = sum_{Med} - sum_{P_{1}}\)

\(val_4 = sum_{P_{1}}\)

我們嘗試列舉 \(M\) , 則只要使得 \(\text{abs}(val_1 - val_2)\)\(\text{abs}(val_3 - val_4)\) 儘量小,過程中對 \(ans\)\(\min\) 即可。

隨著 \(M\) 的增大,若 \(P_1\)\(P_2\) 不變,則 \(val_2\) 會越來越小,而 \(val_3\) 會越來越大,兩個差值也會越來越大,所以 \(P_1\)\(P_2\) 在過程中是單調不減的。

於是調整 \(P_1,P_2\) 實時更新即可。

\(\texttt{Contest 103}\)

\(\texttt{Problem C:}\) \(\texttt{Modulo Summation}\)

\(f(m) = (m \bmod A_1) + (m \bmod A_2) + \cdots +(m\bmod A_n)\) , 求 \(f(m)\) 的最大值。

顯然,令 \(p = \text{lcm}\{A_1,A_2\dots A_n\}\) ,則 \(f(p) = 0,f(p-1)=\sum\limits_{i=1}^{n}A_i-1\) ,直接求 \(f(p - 1)\) 即可。

\(\texttt{Problem D:}\) \(\texttt{Islands War}\)

一條長度為 \(N\) 的鏈( \(i\)\(i + 1\) 相交,共 \(N - 1\) 條邊),有 \(M\) 個衝突條件: \(a_i\)\(b_i\) 不連通,求最小需斷掉邊的條數。

口胡演算法:把 \(a_i\)\(b_i\) 看做區間左右端點,求不相交能放置的最多區間。

設已經按右端點排序過的的區間為 \(P\) ,則任意滿足 \(P_i.r \le P_{i + 1}.r\) ,分兩種情況討論:

  • \(P_i.r>P_j.l\;(i <j)\) ,則一定可以找一個斷點(在 \([P_i.l,P_i.r] \cap [P_j.l,P_j.r]\) 任意一點)分割,同時滿足兩個條件

  • \(P_i.r<P_j.l\;(i < j)\) , 此時它們的區間交 \([P_i.l,P_i.r] \cap [P_j.l,P_j.r]\) 是沒有元素的,於是要新創一個斷點。

這就轉化成在 \([1,n]\) 這個區間裡能放置的最小不相交區間數。

\(\texttt{Contest 104}\)

\(\texttt{Problem C:}\) \(\texttt{All Green}\)

一共有 \(D\) 種題目,第 \(i\) 種題目有 \(p_i\) 道,每道分值為 \(100i\) ,把 \(p_i\) 道題目全部做完能多加 \(c_i\) 的分值。求要達到分值 \(G\) 至少要做的題目數。( \(D \le 10\)

直接暴力列舉要做的題目(二進位制最右邊第 \(i\) 位是 \(1\) ,代表第 \(i\) 道題要做),再從大到小貪心即可。

時間複雜度: \(\mathcal{O}(D\cdot2^D)\)

\(\texttt{Problem D:}\) \(\texttt{We Love ABC}\)

有隻包含字元 ABC? 的字串,求其中有多少個子串 ABC 。( ? 可以代替任何字元)

分類討論:

\(\text{if} \;p_i \not=\;?\)

\(\quad\quad f_{i,0/1/2} = f_{i-1, 0/1/2}\)

\(\quad\quad \text{if} \; p_i=a\quad\quad f_{i,0}\leftarrow f_{i,0}+3^{cnt}\)

\(\quad\quad \text{if} \; p_i=b\quad\quad f_{i,1}\leftarrow f_{i,1}+f_{i,0}\)

\(\quad\quad \text{if} \; p_i=c\quad\quad f_{i,2}\leftarrow f_{i,2} +f_{i,1}\)

\(\text{if} \;p_i = \;?\)

\(\quad\quad f_{i,0}\leftarrow f_{i-1,0}\times 3+3^{cnt}\)

\(\quad\quad f_{i,1}\leftarrow f_{i-1,1}\times 3+f_{i,0}\)

\(\quad\quad f_{i,2}\leftarrow f_{i-1,2}\times 3 +f_{i,1}\)

\(\texttt{Contest 105}\)

\(\texttt{Problem C:}\) \(\texttt{Base -2 Number}\)

把一個數轉化成 \(-2\) 進位制數。

顯然可以使用短除法,但會出現三種餘數: \(1, 0, -1\) 。我們考慮如何處理 \(-1\)

\(a\div -2=c\cdots\cdots -1\)

\(\quad-2c-1=a\)

\(=-2c + -2+1\)

\(=-2(c+1)+1\)

\(a\div-2=(c+1)\cdots\cdots 1\)

\(\texttt{Problem D:}\) \(\texttt{Candy Distribution}\)

求長度為 \(n\) 的序列中總和能被 \(m\) 整除的子段個數。

如果 \(\sum\limits_{i=l}^ra_i\equiv0\pmod m\) ,等同於 \(\text{sum}_r-\text{sum}_{l-1}\equiv0\pmod m\) ,於是可以得出 \(\text{sum}_r\equiv\text{sum}_{l-1}\pmod m\)

map 實時統計即可。

\(\texttt{Contest 106}\)

\(\texttt{Problem C:}\) \(\texttt{To Infinity}\)

一個只有 '1'~'9' 的字串 \(S\) ,每過一天 '1' 會變成 '1''2' 會變成 '22''3' 會變成 '333''4' 會變成 '4444' \(\cdots\) 求過了 \(5\times 10^{15}\) 天后第 \(K\) 個字元是什麼。

因為除了 '1' ,其他數字的個數都以指數型增長增加,所以求第 \(10^{18}\) 字元遠遠小於 \(2^{5\times10^{15}}\) 的。所以只要找到前 \(K\) 個字元的第一個不是 '1' 的數,若前 \(K\) 個數字都是 '1' ,則輸出 '1' 即可。

\(\texttt{Problem D:}\) \(\texttt{AtCoder Express 2}\)

\(n\) 個區間,給定 \(q\) 個詢問,每次詢問 \(l_i\)\(r_i\) 之間有多少個區間( \(l_i \le x,y \le r_i\) )。

先把區間存在數組裡 \(p\) 裡, \(p_{i, j}\) 表示區間 \([l, r]\) 有幾個。

\(dp_{i, j}\) 表示區間 \([i, j]\) 中有幾趟火車,得出如下轉移方程:

\(dp_{i,j}\leftarrow dp_{i+1,j}+dp_{i, j - 1}-dp_{i + 1, j - 1} + p_{i, j}\)

於是 \(\mathcal{O}(n^2)\) 預處理, \(\mathcal{O}(1)\) 查詢。

\(\texttt{Contest 107}\)

\(\texttt{Problem C:}\) \(\texttt{Candles}\)

數軸上有 \(n\) 根蠟燭,第 \(i\) 個蠟燭座標為 \(x_i\) 。從 \(0\) 點開始,至少經過 \(k\) 根不同蠟燭的總路程最小值。

容易的出一個結論:

  • 設兩點分別為 \(i\)\(j\) 且滿足 \(x_i<0\le x_j\) ,路線肯定是 \(0\rightarrow x_i \rightarrow x_j\) 或者 \(0\rightarrow x_j \rightarrow x_i\)

直接暴力出奇跡

\(\texttt{Problem D:}\) \(\texttt{Median of Medians}\)

給你一個長度為 \(n\) 的序列,求每個子段的中位數集合的中位數。

二分答案。 \(\mathcal{O}(\log n)\)

以下是 check ,求子段中位數集合中比 \(\text{mid}\) 大的數是否 \(\ge\left\lceil\dfrac{n}{2}\right\rceil\)

  • 給原陣列重新賦值:小於 \(\text{mid}\)\(-1\) ,反之賦 \(1\)\(\mathcal{O}(n)\)

  • 做一遍字首和,子段和大於 \(0\) 的說明中位數大於 \(\text{mid}\)\(\mathcal{O}(n)\)

  • 用樹狀陣列維護比 \(\text{mid}\) 大以 \(i\) 作為右端點的子段的中位數個數,也就是比 \(1\sim i\) 小的字首( \(\text{sum}_i < \text{sum}_j(i<j),\sum\limits_{p = i + 1}^j A_p > 0\) ),再向 \(\text{sum}_i\) 插入 \(1\) ,即可統計子段中位數大於 \(\text{mid}\) 的個數。 \(\mathcal{O}(n\log n)\)

總時間複雜度: \(\mathcal{O}(n \log^2 n)\)

\(\texttt{Contest 108}\)

\(\texttt{Problem C:}\) \(\texttt{Triangular Relationship}\)

\(a, b, c \le n\)\(k|(a + b) ,k|(b + c) ,k|(a + c)\) ,求這樣的三元組個數。

容易得 \(a=b=c\)\(k|a\) ,則 \(a = b=c=pk\) ,若 \(k \bmod 2 \equiv 0\) ,則有 \(a=b=c=\dfrac{k}{2}+pk\) 。暴力統計。

\(\texttt{Problem D:}\) \(\texttt{All Your Paths are Different Lengths}\)

建一個有向圖,最多 \(20\) 個點, \(60\) 條邊,使得從 \(1\)\(n\)\(L\) 條路徑且長度分別為 \(0\sim L-1\)

找到最大的 \(p\)\(2^p-1 \le L\) ,再在 \(i\rightarrow i+ 1\) 各建一條長度為 \(0\) 和長度為 \(2^{i - 1}\) 的邊(相當於二進位制表示法),我們就表示出了長度為 \(0\sim 2^p-1\) 的邊。

剩下的我們在原來基礎上建邊,迴圈執行以下操作:

  • 令已建的邊數為 \(k\) ,找到最大的 \(p_1\) 使得 \(k+2^{p_1}\) ,在 \(p_1+1\rightarrow p\) 建權值為 \(k+1\) 的邊。

輸出即可。

\(\texttt{Contest 109}\)

\(\texttt{Problem C:}\) \(\texttt{Skip}\)

在數軸上,從點 \(x\) 開始每次可以跳 \(d\) 步,求到達指定點的最大 \(d\)

對每個點與 \(x\) 的距離求一遍 \(\gcd\)

\(\texttt{Problem D:}\) \(\texttt{Make Them Even}\)

給定 \(H\times M\) 的矩陣,在 \((i,j)\)\(a_{i,j}\) 個金幣,每次可以將一個金幣給相鄰的格子,且每個格子只能執行一次,輸出時整個棋盤偶數個金幣格子最多的操作。

直接從左上角,找到奇數金幣的格子轉移到右邊或下面,模擬

\(\texttt{Contest 110}\)

\(\texttt{Problem C:}\) \(\texttt{String Transformation}\)

給定字串 \(S\)\(T\) ,每次可以在字串 \(S\) 裡選擇兩個不同的字元 \(c_1\)\(c_2\),把 \(S\) 中所有 \(c_1\) 替換為 \(c_2\)\(c_2\) 替換為 \(c_1\) ,求 \(S\) 能否變成 \(T\)

因為如果把 \(c_1\) 連向 \(c_2\) ,最後得到的肯定是 \(k\) 個環。

判斷每個點入度是否 \(>1\) 即可

\(\texttt{Problem D:}\) \(\texttt{Factorization}\)

\(n\) 個正整數相乘等於 \(m\) 的個數(數字相同位置不同算不同)。

根據唯一分解定理,已知 \(m = a{_1}^{p_1}\times a{_2}^{p_2} \cdots a{_k}^{p_k}\) 則我們可以對每個 \(a{_i}^{p_i}\) 做一次隔板法,得出方法總數為 \(\sum\limits_{i=1}^{k}\dbinom{p_i+n-1}{n-1}\)

組合數的計算用乘法逆元。( \(\text{mod}\) 請自寫函式減少常數)

\(\texttt{Contest 111}\)

\(\texttt{Problem C:}\) \(/ \backslash/ \backslash / \backslash /\)

有一個長度為 \(N\) 的序列 \(A\) ,求使得序列滿足 \(A_i = A_{i + 2}, A_i ≠ A_{i + 1}\) 的改變元素次數。

統計奇偶性相同的每個數的出現次數,貪心可得都統一成出現次數最多的數,若兩邊相同則取第二個。

\(\texttt{Contest 112}\)

\(\texttt{Problem C:}\) \(\texttt{Pyramid}\)

已知 \(h_i = \max\{H - |x_i-CX| - |y_i-CY|, 0\}\) ,問滿足要求的 \(H\)\(CX\)\(CY\)

直接列舉 \(CX\)\(CY\) ,判斷後再輸出。

\(\texttt{Problem D:}\) \(\texttt{Partition}\)

構造一個有 \(N\) 個數的正整數序列 \(a\) ,使得 \(\sum\limits_{i=1}^N a_i=m\) 。求出 \(\gcd\limits_{i=1}^N a_i\) 的最大值。

使得 \(\gcd\limits_{i=1}^N a_i\) 最大則滿足 \(\min\limits_{i=1}^N a_i | m\)\(m\div \min\limits_{i=1}^N a_i\ge n\)

然後就暴力列舉。

\(\texttt{Contest 113}\)

\(\texttt{Problem C:}\) \(\texttt{ID}\)

\(A\) 國有 \(M\) 個縣和 \(N\) 個市,第 \(i\) 個縣屬於第 \(P_i\) 個市,建立的年份為 \(Y_i\) 。現在想要分給每個縣一個由 \(12\) 位數字組成的編號,如果第 \(i\) 個縣屬於第 \(P_i\) 個市且是第 \(x\) 個創立的,則該縣編號前六位為 \(P_i\)
,後六位為 \(x\) 。試求出所有縣的編號並按輸入順序輸出。

結構體排序練手題。略。

\(\texttt{Problem D:}\) \(\texttt{Number of Amidakuji}\)

請見原題

定義 \(dp_{i,j}\) 表示走到 \((i, j)\) 的方案數,則可以從 \((i - 1, j)\)\((i - 1, j - 1)\)\((i, j + 1)\) 轉移過來。

問題在判斷能不能轉移。

我們列舉上一行的狀態 \(s\) ,如果要從 \((i - 1, j + 1)\) 走過來,前提是 \(s \And 2^j\) ,也就是有路走過來。從 \((i - 1, j - 1)\) 走過來同理。

最後輸出方案數即可。

\(\texttt{Contest 114}\)

\(\texttt{Problem C:}\) \(\texttt{755}\)

求在 \(1\sim N\) 之間各位數上各有 \(3\)\(5\)\(7\) 且沒有其他數的數個數

看範圍就應該斷定廣搜。

寫起來是挺好寫(我用 bitset 辣),只要儲存有沒有 \(3\)\(5\) , \(7\) ,以及數即可。

小細節不多。

\(\texttt{Problem D:}\) \(\texttt{756}\)

\(n!\) 的所有因數中因數有 \(75\) 個的數的個數。

珂以斷定:數一定是 \(k^{74}\)\(k^{14}+k{_1}^4\)\(k^{24}+k{_1}^2\)\(k^{2}+k{_1}^4+k{_2}^4\) ,排列組合計數即可。

\(\texttt{Contest 115}\)

\(\texttt{Problem C:}\) \(\texttt{Christmas Eve}\)

話說最近幾場的題目名怎麼都那麼鬼畜

從長度為 \(n\) 的序列裡選 \(k\) 個數,使得 \(k\) 個數中的最大最小值差最小。

對陣列進行一遍排序,每次選一段長度為 \(k\) 的連續子序列,求極大極小值的差即可。

\(\texttt{Problem D:}\) \(\texttt{Christmas}\)

定義 \(p_k\)\(\texttt b + p_{k - 1} + \texttt p + p_{k - 1} + \texttt b\)\(p_0=p\) ,求 \(p_n\)\(X\) 字元 \(p\) 的個數。

我們不斷將範圍縮小,確定 \(m\) 在第 \(i\) 的哪層,最後遞迴統計。