- 部分自選題(基本口胡)
- A(2014 ACM-ICPC World Finals)
- B(2015 ACM-ICPC World Finals)
- C(2016 ACM-ICPC World Finals)
- D(2017 ACM-ICPC World Finals)
- E(2018 ACM-ICPC World Finals)
- F(2019 ICPC World Finals)
- G(2017-2018 ACM-ICPC Northern Eurasia (Northeastern European Regional) Contest (NEERC 17))
- H(2016-2017 ACM-ICPC Northeastern European Regional Contest (NEERC 16))
- I(2015-2016 ACM-ICPC Northeastern European Regional Contest (NEERC 15))
- J(2014-2015 ACM-ICPC Northeastern European Regional Contest (NEERC 14))
- K(2013-2014 ACM-ICPC Northeastern European Regional Contest (NEERC 13))
- L(2017-2018 ACM-ICPC, Central Europe Regional Contest (CERC 17))
- M(2016-2017 ACM-ICPC, Central Europe Regional Contest (CERC 16))
- N(2015-2016 ACM-ICPC, Central Europe Regional Contest (CERC 15))
- O(2014-2015 ACM-ICPC, Central Europe Regional Contest (CERC 14))
- P(2013-2014 ACM ICPC Central European Regional Contest (CERC 13))
- Q(2017-2018 ACM-ICPC, NEERC, Northern Subregional Contest)
- R(2016-2017 ACM-ICPC, NEERC, Northern Subregional Contest)
- S(2015-2016 ACM-ICPC, NEERC, Northern Subregional Contest)
- T(2014-2015 ACM-ICPC, NEERC, Northern Subregional Contest)
- U(2013-2014 ACM-ICPC, NEERC, Northern Subregional Contest)
目前:131/150。
在做了在做了。
2020/10/19:五十道。感覺寫了一大車模擬題。
2020/10/28:一百道。跳了一大車計算幾何還有大大大模擬。以及 WF 的平均難度和 NEERC/CERC 差得好像有點大。
2020/11/2:由於我太菜了,所以,很抱歉,這份作業咕掉了。
(有 *
標記的並非獨立思考出來的,即參考了題解或與國集大佬討論過后得到的思路)
部分自選題(基本口胡)
沒寫的題會在后面加上 “(?)” 的標記,不保證正確性。
我怎么感覺我好像都沒寫。
#208. function(?):由於模 \(p^k\) 意義下存在原根,所以此時解的個數只與 \(3|\phi(p^k)\) 是否成立有關。而模合數的解個數等於模所有質因子冪的解個數的乘積,所以跑個類 min-25 的東西即可。
#224. minmex(?):最短路圖上支配樹,則只需要找到最大的 \(x\) 滿足 \(0\sim x\) 形成一條自上而下的鏈。線段樹維護區間是否形成這樣一條鏈,以及如果形成,鏈的最高點和最低點。
#240. Communication Network(?):感覺和 “WC2019 數樹” 差不多,就是最后樹形 dp 的時候再加一維狀態?
#248. Ghost domino(?):考慮按 \(W_i\) 從小到大加點,求出經過該點的最長路徑長度。如果是樹則直接並查集。注意到只有加入環上的最后一個點時才變成基環樹,因此加最后一個點時特判即可。
#256. Binary Search Tree(?):感覺可以對朴素 dp 做線段樹合並?
#264. 如果會出題就好了(?):換根查詢單點的 \(f(x)\) 可以做到 \(O(1)\)。考慮將查詢拆成兩部分,一部分的 \(f(x)\) 不改變,直接來;另一部分考慮輕重鏈剖分,重鏈直接維護,輕邊暴力跳。
#268. Sequence(?):單調棧 + 經典維護前 7 位查詢后 7 位,應該可以做到 \(O(2^7\times n)\)?
#272. Find a city(?):用 \(n - 1\) 次查詢求出可能有 \(n - 1\) 個出度的點;用 \(n - 2\) 次查詢求出可能有 \(n - 2\) 個出度的點;然后對兩個點分別 check 一遍。總操作次數 \(\leq 4n\)。
#276. Fierce Storm(?):考慮保留安全系數 \(\geq v\) 的點做避難所,求出合法的概率。可以做朴素 \(dp(0/1, u)\),然后動態 dp 優化。
#296. Tree & Derangement(?):感覺就是 loj - 6289?但是不知道 \(O(n\log^3 n)\) 過不過得了。
A(2014 ACM-ICPC World Finals)
A - Baggage:首先注意到答案有平凡下界 n:考慮相鄰的相同元素個數,初始為 0,終止為 2n - 2,每次操作最多增大 2,且第一次最多增大 1。觀察樣例,猜想下界一定可達。然后特判 n = 3,根據 n mod 4 分四類討論,可以先構造 n = 4k 的情況,再在此基礎上改一些細節得到其他情況。具體構造方法可見代碼。
B - Buffed Buffet:離散情況是個平凡的背包 + 斜率優化。連續情況即最大化 \(\sum(t_i X_i-\frac{\Delta t_i}{2}X_i^2)\),滿足條件 \(\sum X_i=S,X_i\geq 0\)。取最優解時,對於所有 \(X_i\neq 0\) 的 \(i\) 均有 \(t_i-\Delta t_i X_i\) 相等,不妨設為 \(p\),此時還應滿足對於所有 \(X_i=0\) 的 \(i\) 有 \(t_i\leq p\)。注意到 \(t_i-\Delta t_iX_i\) 單調遞減,因此一定是 \(t_i\) 最小的幾個滿足 \(X_i = 0\)。那么枚舉一下哪些 \(X_i = 0\),注意可能會有 \(\Delta t_i = 0\) 的情況。
C - Crane Balancing:求多邊形的重心:拆成若干三角形,三角形的重心易求,質量正比於面積(面積為負也是對的,其實就是叉乘),然后做個類似帶權平均數。注意如果重心在外而貨物在邊界上無解(因為貨物不可能無窮大)。
E - Maze Reduction:兩個點不等價當且僅當度數不同,或它們的邊序列的循環移位都不對應等價。兩條邊不等價當且僅當它們的終點度數不同,或者它們同時往后數的第 \(i\) 條邊不等價。從平凡的不等價邊開始推即可得到所有等價關系,直接時空復雜度 \(O(n^4)\) 就可以過了(也有可能有更緊的時間復雜度分析)。
F - Messenger:記 \(f(i,j)=t_i+d_{i,j}-t_j\) 表示郵遞員從 \(i\) 點走到 \(j\) 點是否可行,如果可行,則顯然 \(f(i,j)=0\)。注意到 \(f(i,j)\) 關於 \(i, j\) 單調,因此可以二分 \(O(\log)\) 找到以某個點為起點/終點對應的終點/起點。考慮路徑為兩條線段的情況,列方程解發現是 郵遞時間 是關於 出發時間 的對勾函數。由於單調,原本的兩條路徑可以 \(O(n\log n)\) 的時間內剖成若干組 “兩條線段” 的形式。但是明明對勾函數可以直接求最值,為什么我還要去寫個三分變成兩個 log 然后還被卡 TLE 了兩次。
G - Metal Processing Plant:給定 D(A), D(B) 后(不妨假設 D(A) < D(B))只需要 2-sat 判定,且沒有邊同時依賴於 D(A), D(B)。
從大到小枚舉 D(B),當且僅當 D(A) 小於環上最小邊時,環才會出現,因此轉化為 “求最大的不合法環的權值,其中環的權值定義為環上的最小邊”,可以 floyd。
考慮進一步優化,實際上只有 \(O(n)\) 個 D(B) 值會改變 floyd 的取值(考慮 > D(B) 的邊的實際含義:邊的兩端不能同屬一個集合),因此可以做到 \(O(n^3)\)。
H - Pachinko:考慮先求出 \(f_{i,j,k}\) 表示從 \((i,j)\) 出發,第一次走到 \(i+1\) 行是 \((i+1,k)\) 的概率,同理求出 \(g_{i,j,k}\) 表示從 \((i,j)\) 出發,第一次走到 \(i-1\) 行是 \((i-1,k)\) 的概率,都可以用高消在 \(O(hw^3)\) 的時間內搞定。之后可以求出 \(p_{i,j}\) 表示第一次走到第 \(i\) 行是 \((i,j)\) 的概率,再利用 \(f,g\) 就可以高消算出第 \(i\) 行的答案,這部分時間也是 \(O(hw^3)\)。好像 \(\epsilon\) 調小了,然后就被卡了次精度。
I* - Sensor Network:最大團啊,最大團不是 npc 問題嗎,咋做啊。要不直接隨機排列跑,反正 n 這么小。誒誒誒!它怎么就 AC 了呢。反正就是隨機做,不會證正確性。
注:這道題存在合理的多項式算法。之后我大概會補上(大概,嗯)。
K - Surveillance:將環變成兩倍長度序列,去掉被包含的區間(為了方便,顯式地去掉更好)。則選定一個區間,最優的下一個區間是固定的,於是可以倍增求以每個區間為第一個區間的最小覆蓋代價。
L - Wire Crossing:基本是個平面圖轉對偶圖的裸題(mark 一份鏈接),不過注意這個平面圖不一定連通 然后就被卡精度卡到懷疑人生。
B(2015 ACM-ICPC World Finals)
B - Asteroids:讓一個多邊形固定不動,算出相對速度。以速度方向為水平方向重新建軸,可以將 “凸多邊形面積交” 拆解成若干組 “兩個水平運動的梯形面積交”,可以進一步差分成 “兩個半平面的交”。由此可知面積交是一個關於時間的分段二次函數,分類討論 / 插值求出每一段的解析式即可。注意擦邊也算相交(即使相交面積為 0)。
E - Evolution in Parallel:考慮按長度從大到小處理,假設已經有兩組子序列降列,如果當前串兩組都不能加入,則無解;如果只能加入一組,直接加;否則找到之后第一個不是當前串的子序列的串,則貪心地把中間的串與當前串放在一組里,這樣一定不劣。因此只需要做 \(O(n)\) 次子序列判定。
G - Pipe Stream:二分為啥不行,因為到達終點后沒法區分。不過貪心地在能敲的時刻馬上敲是對的。考慮決策樹,葉子為長度 \(\leq t\) 的區間,那么考慮貪心地將葉子設為 \([v_1,v_2-kt],\dots,[v_2-2t,v_2-t],[v_2-t,v_2]\)。“到達終點后沒法區分” 這一條件對應在決策樹上,即相鄰葉子必須某一深度之前分開,那么上面的葉子取法可以讓這個深度限制盡量松。由於答案為 \(O(\log)\) 級別所以直接暴力枚舉,把當前深度必須分離的葉子分離出去,如果不夠則無解;否則判斷葉子個數是否超過所需個數,如果超過則找到答案;如果沒超過,則每個葉子又可以裂成兩個新葉子。
H - Qanat:可以發現兩個井相鄰之間存在分段點,左邊走左井,右邊走右井。差分距離 \(d_i = x_{i+1}-x_i\),則有 \(\sum d = w\),且代價是關於 \(\{d_i\}\) 的二次函數。考慮拉格朗日算子法,變成線性方程組,發現有點規律,於是就過了。感覺應該有更高妙的做法(找規律找得我快吐了)。
J - Tile Cutting:\(f_k = \sum_{a+b=k} \sigma(a)\times \sigma(b)\),直接 ntt 可過。
K - Tours:如果兩條邊所在的簡單環集合相同,則稱它們等價。題目的充要條件即 “所有等價邊類內部每種顏色的邊數量相等”,那么只需要取等價邊集合大小的 gcd 即可。求等價邊集合可以 tarjan 的時候暴力找,時間復雜度 \(O((m+n)n)\)。
L - Weather Report:哈夫曼樹,把初始權值相同的放在一起。
M - Window Manager:其他命令暴力模擬檢驗。對於 move,不妨只考慮水平向左移動的情況,其他三種同理。將窗口按左上角橫坐標從小到大排序,則前面的窗口一定被后面的窗口撞,從后往前掃並求出每個窗口第一次被碰撞的時間,同理求出第一次碰撞左邊界的時間即可。注意像素是有面積的格子而不是格點(好像這是常識)。
C(2016 ACM-ICPC World Finals)
A - Balanced Diet:可以發現約束是線性規划形式(變量 \(x_{i,j}\) 表示第 \(i\) 天是否吃第 \(j\) 顆糖),因此轉化成最大流,貪心模擬增廣。如果從左往右進行了 \(\sum a_i\) 次增廣仍然有解,則之后也一定有解(注意原序列長度 \(>\sum a_i\) 仍然可能無解)。
B - Branch Assignment:先最短路。可以貪心地讓同一個組里的值域連續(一定不劣),所以變成排序后區間划分。之后就決策單調性(類似於 CF321E/bzoj5311)。好像不用帶權二分直接 \(O(bs\log b)\) 的決策單調性也可以過。
D - Clock Breaking:對着題意模擬。
F - Longest Rivers:對於河流 \(i\),最優肯定把它延伸到根,然后得到若干個 “子樹 + 單邊”。考慮怎么求一個的最大貢獻,先看它內部所有河流是否都能 \(\leq d_i\),如果可以,則最優情況應該是取兒子中最短的河流;如果不可以,看是否存在一個子樹不能全部 \(\leq d_i\),如果有,那就把不合法的河流引上來,該結點就沒有影響;否則,至少要刪去一個河流。那么每個結點的貢獻都是獨立開來的,分葉結點和非葉結點討論。
J - Spin Doctor:把 \((a_i,b_i)\) 當作坐標,對 \(c_i = 1\) 的點求凸包,則答案即在凸包上旋轉卡殼時包含的最少點數,事實上只需要求 \(c_i=0\) 的所有點是否在凸包內,以及在凸包外的點與凸包的兩條切線斜率。可以如下圖 終於肯畫圖了 一樣三角剖分,先二分找到每個點所屬三角形,由此可判是否在凸包內。然后分兩邊三分(或者說二分斜率)找切點即可。特判凸包點數小於 3 的情況;特判下圖中的黃點(切點是三角剖分的基准點)與紅點(共線)所屬情況(不特判容易 WA 比如我就 WA 了 6 次才過)。
K* - String Theory:首先正確理解題意 發現 “k引用” 里面恰好包含 1 個 “(k-1)引用” 最優,枚舉模擬即可。注意特判 “1引用”。
M - What Really Happened on Mars?:雖然是遞歸定義,但題目中有說明這個遞歸定義不會成環,也即阻塞關系形成 DAG。首先確定出直接阻塞關系。如果某任務現在的 “current priority” 已經大於某資源的 “priority ceiling”,則它們不會形成阻塞(最終的 “current priority” 一定不會更小)。如果某任務與其他任務是否阻塞已經明確,則它的 “current priority” 不再改變,用該值更新其他任務即可。如果逐個命令模擬可能會 TLE(也有可能是因為我實現方法太垃圾),可以考慮記錄阻塞關系是否改變,如果不改變就不需要重新計算。
D(2017 ACM-ICPC World Finals)
A - Airport Construction:最長線段一定經過兩個頂點,枚舉並嘗試求解。相當於判定是否兩個點連線上的點都在多邊形內(如果不是則不合法),與求兩個點向外最近的不在多邊形內的點。用射線法判點是否在多邊形內的思想,讓射線始終在兩點所在直線上,即可 \(O(n)\) 求解。總復雜度 \(O(n^3)\)。
B - Get a Clue!:枚舉 + 狀壓(我甚至懷疑直接暴力枚舉都能過)。
D - Money for Nothing:決策單調性,注意決策區間有范圍,用單調棧二分要好寫點(之前做過)。
G - Replicate Replicate Rfplicbte:如果沒有 bug,則上一個狀態的左右上下邊界一定是當前狀態的邊界往內縮 1 單位,那么總可以從左上到右下推回上一個狀態,且是唯一的。如果有 bug,只需要分別找到第一個不合法的行、列,將對應的元素修改,然后再 check 一遍即可。
J - Son of Pipe Stream:令 \(f'=vf\),則流量守恆變為 \(f'+w\leq c\),只需最大化 \(F'^aW^{1-a}v^{-a}\)。
注意到最優點 \((F',W)\) 總是在線段 \(F'+W=maxflow(F'\in I)\) 上取,因此目標函數 \(F'^a(c-F')^{1-a}\) 是凸的,三分即可知最優點。
結果發現最難的是構造方案,主要是兩種液體必須同向流動。先跑出最大流,將所有流量為正的邊容量設為當前流量,流量為負的邊容量設為 0,然后再從匯點向水源點退流,則剩下的流量即 flubber,流量的差值即水。
K - Tarot Sham Boast:(以下都是猜測,全部不會證)當 \(n\) 足夠大時可以用經典概率生成函數,發現 \(\sum_i [s_{1\dots i}=s_{m-i+1\dots m}]\times \frac{1}{3^i}\)(即第一次的期望)越大在越后面。當 \(n\) 較小的時候,比較短的 border 用不到(可以根據概率生成函數發現這一性質),那么只比較前 \(n-m\) 大的 border 即可。
L - Visual Python++:掃描線,從左往右,自下而上。掃描到一個右下角,該右下角必定與豎直距離最接近的左上角匹配。新匹配的矩形會產生一些限制,可以拆解為 “矩形正右邊的 右下角 只能匹配矩形右邊的 左上角” 與 “矩形正上方的 左上角 只能匹配矩形上方的 右下角”,簡單維護一下。
E(2018 ACM-ICPC World Finals)
C - Conquer the World:模擬費用流。
D* - Gem Island:簡單算算可知所有情況可能性相等(目前不知道組合意義是啥)。那么可設 \(f_{i,j}\) 表示把 \(j\) 顆寶石分給 \(i\) 個人,前 \(\min(r,i)\) 大之和的期望。轉移類似於整數拆分,枚舉多少人有寶石,因為可能性相等所以概率用組合數算(目前也不知道 double 的精度為啥能過)。
發現此題還有時間復雜度更優的解法,補充在這里:
枚舉前 \(i\) 大 \(\geq x\),后 \(n - i\) 個 \(< x\),則容斥可得方案數為 \(\sum \binom{n}{i}\sum_{p=0}^{n-i}(-1)^p\binom{n-i}{p}\binom{d-(p+i)x+n-1}{n-1}\),貢獻為 \(\min\{i, r\}\)。答案為:
\[\frac{1}{\binom{d+n-1}{n-1}}\left(r + \sum_{i=1}^{n}\sum_{p=0}^{n-i}\min\{i, r\}\binom{n}{i}\binom{n-i}{p}(-1)^p \left(\sum_{x=1}\binom{d-(p+i)x+n-1}{n-1}\right)\right) \]
相信大家的公式恐懼症又犯了。記 \(f_{i+p} = \sum\min\{i, r\}\binom{n}{i}\binom{n-i}{p}(-1)^p\),再記 \(g_{i+p} = \sum_{x=1}\binom{d-(p+i)x+n-1}{n-1}\),則答案為 \(\frac{1}{\binom{d+n-1}{n-1}}(r + \sum f_i\times g_i)\)。考慮怎么求這倆。
首先 \(f_1 = n, f_k = \binom{n}{k}\binom{k - 2}{r - 1}\),至於為什么
不會證,告辭(其實會證但是證得很麻煩 qaq)。然后 \(g_k = \sum_{x=1}\binom{d-kx+n-1}{n-1} = \sum h_{kx}\) 可以狄利克雷前綴和做到 \(O(n\ln\ln n)\)。
因此總時間復雜度 \(O(n\ln \ln n)\)。
E - Getting a Jump on Crime:按題意模擬,注意邊是有向的 難點在解二次方程組。
H - Single Cut of Failure:冷靜分析一波,發現連接對角線必然是合法解。所以問題簡化為是否可以一條線切斷所有,轉化到區間上即一個區間與所有區間同時嚴格相交(不包含、不相離),隨便判一判即可。
I - Triangles:讀入比較麻煩。處理好讀入的各種 cases(比如 c = 1)后,可以將問題轉化為求 \(a_y\leq x \leq y \leq b_x\) 的二元組數量,直接 \(O(rc\log c)\) 就可以過了(雖然我自己跑了 5s,不清楚是否有更優解)。
F(2019 ICPC World Finals)
B - Beautiful Bridges:觀察到時限 10s 且 \(n\leq 10^4\),所以直接暴力來。如果固定右端點且只考慮拱橋的右半部分是否合法,則左端點可取的范圍是一個區間;對於左端點同理。於是就可以 \(O(n^2)\) 暴力 dp 了。
F - Directing Rainfall:對橫坐標離散化,考慮從上往下掃描每個擋板,並對於每個橫坐標從上面到達當前點的最小代價。則一個擋板的影響可以看作 “區間執行 \(a_i=\min\{a_j|j\in[l,i]\}\) 或 \(a_i=\min\{a_j|j\in[i,r]\}\)” 與 “區間加”,線段樹維護即可。但是直接掃描不現實,考慮處理擋板之間關於上下遮擋關系的拓撲序(注意它是偏序但不是全序)。從右往左掃描,在加入某個擋板的右端點時求出此時它上下最近的擋板,並連邊,最后跑拓撲排序即可。
G - First of Her Name:trie 上查詢子串出現次數。廣義后綴自動機模板題。
I - Karel the Robot:考慮求出 “當前格子 \((x, y)\),方向 \(d\),執行第 \(i\) 個 program(可能是某個 program 內部的子 program)” 最終到達的點(或者說無限循環),只需要在模擬時判斷是否到達曾經到過的點即可。總狀態數量 \(O(40\times 40 \times 4 \times (26 + 10) \times 100)\),可以接受。
J - Miniature Golf:考慮每個人分別計算答案,其他每個人和這個人的大小關系可以分成 \(O(h)\) 段,總共 \(O(ph)\) 段,每一段取最小值即可,時間復雜度 \(O(p^2h)\)。
K* - Traffic Blights:問題轉化為隨機非負整數 \(x\),同時滿足若干形如 \(x\bmod m_i \neq a_i\) 的限制的概率。注意到若 \(m,n\) 互質,則 \(x\bmod m \neq a\) 與 \(x \bmod n \neq b\) 的概率是獨立的。如果所有概率獨立,就可以分開維護每種限制的概率,最后相乘即可。
考慮讓這些概率獨立,思路是,用全概率公式將其拆成若干條件概率之和,使得條件概率是獨立的,於是分開維護條件概率即可。一個直觀想法是利用 “一個數最多包含一種 \(>\sqrt{a}\) 的質因子” 的性質,設條件 \(i\) 為 \(x \bmod 64\times81\times25\times49=i\),這樣得到的條件概率的含義是 “模 \(>\sqrt{a}\) 的質數”,顯然它們兩兩互質,即它們的概率獨立。
但是顯然效率不夠。考慮利用性質 “一個數的質因子冪最多有一個 \(>\sqrt{a}\)”,這樣可以設條件 \(i\) 為 \(x \bmod 8\times9\times5\times7=i\),得到的條件概率的含義是 “模質數 \(\leq a\) 的最大冪”,它們也兩兩互質,而且效率更高。
G(2017-2018 ACM-ICPC Northern Eurasia (Northeastern European Regional) Contest (NEERC 17))
F - The Final Level:第一步橫縱坐標距離最大減少 \((n-1)\),之后每一步橫縱坐標距離一個減少 \((n-1)\),一個減少 \(n\)。因此能夠走到的位置即一個正方形挖去四個角,可以二分(或者直接枚舉)求出最小操作次數。構造時讓橫縱坐標差得比較遠的減少 \(n\),另一個減少 \((n-1)\),判斷一下減少 \((n-1)\) 是否會走過頭。
G - The Great Wall:二分 + 平衡樹/離散化后樹狀數組。
I - Interactive Sort:本質其實是排序,考慮用快排的思想,只需解決划分的問題。可以從奇數里面隨機選來划分偶數,從偶數里面隨機選來划分奇數。但這樣區間不一定划分均勻,可以考慮先跑左邊,然后把左邊無法確定的元素塞到右邊一起處理。不過這樣次數會略多,可以考慮把之前詢問過的答案存下來,這樣就可以跑過了。
J* - Journey from Petersburg to Moscow:考慮讓不合法的路徑變得不優。邊數 \(<k\) 的路徑直接跑最短路。對於邊數 \(\geq k\) 的路徑,考慮枚舉下界 \(p\),只對權值 \(\geq p\) 的邊計算費用。此時可以將 \(\geq p\) 的邊權減去 \(p\),求出最短路后加上 \(k\times p\)。
K - Knapsack Cryptosystem:當 \(n\) 比較小時用 meet in the middle;當 \(n\) 比較大時則 \(a_1\) 一定很小,直接枚舉 \(a_1\) 然后 check 是否 \(a\) 序列合法。(草,原來 \(a_1r=b_1\) 在模合數意義下可以有多個 \(r\)。感覺說出這種話就像自己沒學過數論一樣,啊的確沒學過。)
L - Laminar Family:考慮把路徑放在最高點 lca 處。對於根 x,如果沒有路徑經過它,遞歸到子樹。否則取出最長路徑,則其他路徑一定是它的子集,然后轉化成鏈上的問題,即判斷是否存在區間嚴格相交。之后刪掉這條路徑繼續遞歸子樹即可。
H(2016-2017 ACM-ICPC Northeastern European Regional Contest (NEERC 16))
B - Binary Code:trie 優化 2-sat 建圖(之前寫過,不過不知道為啥在某 oj 上過不了)。
C - Cactus Construction:用圓方樹處理,每次保留最少限度的顏色(比如之后不會再連邊的點設為同一顏色),發現最多確實只有 4 種顏色。
D - Delight for a Cat:經典費用流,可以線性規划轉,也可以直接建。(為什么 long long 轉 int 沒報警告啊,為什么這會輸出不合法的解啊)
G - Game on Graph:按強連通縮點后拓撲序從后往前的順序分別處理每一個強連通分量,特判無自環的單點。
先判是否無限,對於 Gennady 如果存在一個后繼無限則無限,對於 Georgiy 如果所有后繼無限則無限。如果不能根據已知信息判斷是否無限,則可以推斷它一定無限(對於兩名玩家而言,最優策略都是走另一個無法確定的點,那么就會在無法確定的點之間循環)。
然后再判勝負,類似地,存在一個后繼必敗則必勝,所有后繼都必勝則必敗。無法確定的點 Gennady 必勝,Georgiy 必敗(寧願輸也不會循環)。
兩個過程都可以用隊列處理,目前不清楚是否可以把兩個過程縮成一個。(我怎么就過了,我又改了哪里,這些不都是等價改動嗎.jpg)
K - Kids Designing Kids:去掉周圍的空格。如果矩形 1 第 1 列沒有和矩形 2 的第 1 列重合相消,那么矩形 1 第 1 列一定等於矩陣 3 的第 1 列。同理可得共 4 種情況,還有 1 種情況即矩陣 1, 2 的第 1 列第 1 行重合。模擬即可(我自己寫的模擬方法是存所有 *
的坐標,好像比別人的長一倍,不知道另有什么高妙的方法),注意矩形 3 可以全空。
L - List of Primes:不難猜到當字符數量 \(\leq 10^{18}\) 時素數之和並不大,打表可以驗證素數之和最大是 2100 ~ 2200。先找到 \([l, r]\) 之中的第一個方案,然后不斷地尋找下一個方案。背包預處理 \(f_{i,j}\) 表示使用 \(\geq i\) 的素數湊出和為 \(j\) 的方案數,然后逐位貪心即可。
M - Mole Tunnels:還是費用流。只要建出反向邊,每次跑最短路即可得到最小費用最大流。維護一下反向邊的貢獻即可,因為原樹高 \(O(\log)\) 所以直接來。注意反向邊是由 \(1\to-1\),所以對應在邊權上應該是 \(\pm 2\)。
I(2015-2016 ACM-ICPC Northeastern European Regional Contest (NEERC 15))
B - Binary vs Decimal:直接暴搜,可以把 \((10^p-2^p)\) 按 lowbit 從小到大排序,因為模數是 2 的冪所以可以根據 lowbit 剪剪枝,效果十分顯著。可以通過打表把二進制位數確定下來再搜。
C - Cactus Jubilee:如果刪非環邊,原圖裂成兩個連通塊,合法邊數量即連通塊大小之積。如果刪環邊,新圖仍是仙人掌,考慮建出圓方樹,則圓圓邊形成的連通塊內部都可以連邊(但不能連重邊)。新圖和原圖只相差刪掉的邊所在環,維護一下即可。
D - Distance on Triangulation:考慮經典分治,找到一條對角線使得它盡量均分多邊形,則對角線兩邊的點之間任意路徑一定經過對角線的某個端點(同 ZJOI2015 旅行者)。雖然我並不知道為啥總能找到這樣一條盡量均分的對角線。
H - Hypercube:不清楚正確的判別姿勢是什么。不過你可以考慮類比六個面折成正方體的方法:將六個面平鋪在 xy-平面,固定一個下底面,把每兩個相鄰的面 “向上” 折起,最后如果沒有兩個面重合則一定有解。推到四維情況,可以用中心點 + 法向量形式表示正方體,然后類比二維咋折的,折出來過后判是否有中心點重合即可。
J - Jump:如果有一個 n/2 的詢問,可以同時給兩個位置取反並再次詢問,以此判斷兩個位置是否同時和答案相同,那么只需要最多 \(n+1\) 次詢問即可問出來。考慮怎么找一個 n/2 的詢問 發現不會做,於是隨機化。隨機一個 01 串,直到返回 n/2 為止,概率為 \(\frac{\binom{n}{n/2}}{2^n}\)。
K - King's Inspection:如果出邊唯一,則哈密頓回路必然包含這條出邊。暴力枚舉出邊不唯一的,用並查集判是否形成哈密頓回路。
L - Landscape Improved:二分 + 單調隊列 check。
J(2014-2015 ACM-ICPC Northeastern European Regional Contest (NEERC 14))
C - Cactus Generator:在遞歸時給定首結點與尾結點的編號,最后把編號改一改,使得滿足 1 號點是首結點、n 號點是末結點,這樣就可以 \(O(|E|)\) 構造仙人掌。對於要合並的圖列表,特判第一個圖和最后一個圖(當然還要特判只有一個圖的情況),然后按照規則合並即可。建出圖后跑個歐拉路,不知道有沒有更簡單的做法。
E - Epic Win!:如果已知對手的當前狀態,則可以構造一個 \(O(n)\) 的 \(\rho\) 形圖,使得之后一直贏。如果對於兩個點構造出的 \(\rho\) 形圖同構,則認為這兩個點等價。嘗試用有限步區分所有等價點,如果當前對手可能的狀態集合存在某些狀態輸出不一樣,則自己的自動機隨便輸出即可區分;否則,輸出能夠贏對手的(即 \(\rho\) 的第一步)。如果連續 \(n\) 次都無法區分,則它們等價。
G - Gomoku:自己手動實現一個交互庫,然后和人工智障愉快玩耍,順便人腦構造必勝策略(你玩五子棋還玩得過我?)。代碼給出了一份參考策略 因為策略有些復雜就不放上來了。
H - Hidden Maze:眾所周知,像這樣隨機生成的樹直徑長 \(O(\sqrt{n})\)(當然你不能像我一樣老老實實就開到剛好 \(\sqrt{n}\) 的空間對吧)。於是從小到大枚舉邊,將小於的標為 -1,大於的標為 1,相當於求有多少權為 0 的路徑經過枚舉的邊,怎么暴力怎么維護。(yhn 那天還來問過我咋證明,但我也不會,然后他說他問了周圍一圈沒一個會的)。
I* - Improvements:只需要選出一個最大合法子序列即可,然后你發現合法的飛船子序列與一個編號先增后減的飛船子序列一一對應,然后 LIS 就完了。草哦為什么我這么傻逼。
K(2013-2014 ACM-ICPC Northeastern European Regional Contest (NEERC 13))
A - ASCII Puzzle:想題五秒鍾,讀題半小時。本質就是正常的拼圖,題目所給的限制其實保證了你可以區分拼圖是否在邊界上,這樣搜索量在 \(n = 4\) 時也最大只有 \(2^4\times 4!\)。為了代碼簡單我刪去了一些剪枝(結果一開始還 TLE 了)。
C - Cactus Automorphisms:建圓方樹,找重心(一定沒有對稱邊)。對於方點,如果不是重心,則只有兩種同構方式(分別為正着擺放兒子、倒着擺放兒子),因為有順序所以做兩個字符串 hash,取較小值;如果是重心,則可以翻轉兒子序列 + 旋轉兒子序列,找到所有可能的字符串 hash 判一判。對於圓點,類似於樹同構計數(草,我怎么把 “將 \(x\) 的方案數攤到 \(x\) 的質因子上” 這一步寫錯了)。
D - Dictionary:考慮某個串的貢獻,它的前綴可以重復利用另一個串的中間部分,除去前綴剩下的就是它自己的貢獻。因此求出每個串 si 重復利用另一個串 sj(可以是空串)的中間部分,最大能重復利用多少。然后變成最小樹形圖問題,不過還要輸出方案,可以考慮用遞歸實現朱劉算法,這樣比較方便拆零環。得到最小樹形圖方案后再建 trie 跑一跑即可。
關於最小樹形圖咋做。WC2020 員交有一個 “優先內向樹擴張算法”,但我
沒看懂覺得不方便輸出方案,所以 mark 一下朱劉算法:每次找到每個點的最小出邊,如果無環則找到解;否則把環縮點,每個點的所有出邊減去最小出邊(可以理解為 “替換當前出邊” 的代價),然后重復該過程。
優化使用可並堆 + 並查集即可。
G - Green Energy:如果塔落在地形產生的陰影里,則可以將其挪到產生陰影的最高點,一定不劣。考慮以陽光方向為 \(x\) 軸建正交系,則塔的覆蓋范圍轉化為 \(y\) 軸上的動線段,地形轉化為塔對應線段的左端點范圍區間。可以貪心地把高塔的左端點往右放,矮塔的左端點往左放。
H - Hack Protection:固定右端點,往前 and 只有 \(O(\log A)\) 種取值。求異或前綴和,對於每種取值在動態開點線段樹上查詢區間和即可。
I - Interactive Interception:一共有 \((v+1)\times (p + 1)\) 個決策點,每次嘗試找到使得決策集合盡量均分的詢問。為了方便,將詢問的左端點設為最左邊的點,這樣子所有決策點可以分成 \(O(v)\) 個區間,然后枚舉一下右端點在哪里即可。
K - Kabaleo Lite:枚舉你的對手們想要最大化的,則 \(n\) 個堆可以分成 3 類:你想要最大化;你對手想要最大化的;其他的。再枚舉你選擇這 3 類中的哪一類,判斷是否合法。細節較多(比如最后一個人的顏色必須存在於場上)。
L(2017-2018 ACM-ICPC, Central Europe Regional Contest (CERC 17))
B - Buffalo Barricades:如果僅考慮形態而不考慮先后順序,可以從右往左掃描線維護答案。但可能出現先詢問外面再詢問里面的情況,可以考慮根據包含關系建樹(在掃描線的時候建),然后從大到小用並查集把當前點的答案向上合並。
C - Cumulative Code:對 \(m\) 的大小分類。\(m\) 較小的暴力查;\(m\) 較大的公差一定小,做個 dp。總時間復雜度 \(O(2^{k/2}\times q\times \log A)\),聽說可以少個 \(O(\log A)\),但我不會。
D - Donut Drone:倍增不方便維護,考慮找循環節。平衡 “每次詢問暴力找循環節” 與 “每次維護出修改后所有位置的循環節” 的時間,考慮維護第一列跳 c 步(一定又回到第一列)到哪一行,單次詢問利用維護的信息可以做到 \(O(R+C)\)。
修改看作改點的 next,此時對於某一列影響到的點一定是連續的,所以可以 \(O(R+C)\) 維護第一列哪些行的信息變化。
總時間復雜度 \(O(MR+MC)\)(WA 的原因:直接修改第一列的 next 時出問題)。
E - Embedding Enumeration:以 1 為根時每個點最多 2 個兒子。記 \(f_{i,j}\) 表示以 \(i\) 為根的子樹中,\(i\) 所在的行比另一行少 \(j\) 個連續的空格(其實應該配張圖,但是我懶.jpg)。分情況討論 \(f\) 的轉移,發現大多數時候用到的是 \(f_{i,0}\),只有一條鏈時才會用到其他的。於是把一條鏈的單獨拿出來做 dp,求出所有的 \(f_{i,0}\) 即可。時間復雜度均攤下來是 \(O(n)\) 的。
I - Intrinsic Interval:從左往右掃描並單調棧 + 線段樹維護 \(f_l =(\max-\min)-(r-l)\) 是否為 0,如果是則 \([l, r]\) 為連續段。由於 \(f_l\geq 0\),所以等價於維護 \(f\) 的最小值。一種方法是離線,利用連續段的交仍是連續段的性質,可以先找到最小可能的右端點,再找最大合法左端點。
也可以增量法建析合樹求 lca(以下沒實現過,不清楚口胡得對不對)。
考慮維護當前析合樹森林的根構成的棧,如果當前點能成為棧頂的兒子(此時棧頂一定是合點,記得還要判是否單調)就接上去。
否則先用 \(f\) 判斷是否可以往前合並成更大的連續段,如果不行直接停止;如果可以,不斷彈出棧頂直到成為連續段,新建點並向這些元素連邊。如果新點只有兩個兒子則為合點,否則為析點。
每次更新當前點並重復上述操作。
K - Kitchen Knobs:因為 7 是質數,如果數位不全相同,則最優方案唯一。求出轉動次數並差分,問題轉化為每次可以選擇兩個一加一減,或者選擇一個加,全部變 0 的最少操作。可以轉化為選出盡量多不交集合,滿足每個集合內 \(\sum x\bmod 7 =0\)。注意到貪心地選出 \(\{x,7-x\}\) 作為集合總是不劣的,因此 1 和 6、2 和 5、3 和 4 之間可以分別貪心地刪去一種,最后只剩最多 3 種數,dp 即可。
L - Lunar Landscape:注意到坐標范圍比較小,搞點類似於斜着二維差分的東西即可 \(O(A^2+N)\) 的時間內求出每個單位格的貢獻。
M(2016-2017 ACM-ICPC, Central Europe Regional Contest (CERC 16))
B - Bipartite Blanket:hall 定理 + two points。
E - Easy Equation:苦思冥想一小時,打表出解五分鍾。首先注意到有一組平凡解 \((1, k,k^2+k)\),考慮怎么根據一組解 \((a,b,c)\)(無妨假設 \(a<b<c\))擴展出其他解。如果知道擴展方法,hash 判重即可構造 \(n\) 組互不相同的解。
注意到有二次方程 \(a^2-k(b+c)a+(b^2+c^2-kbc-1)=0\) 成立,由韋達定理可得 \(a'=k(b+c)-a\) 是另一零點,且它滿足 \(a' > b, a' > c\)(由於 \(k > 1\)),所以 \(a'\) 為正整數,有新解 \((b,c,kb+kc-a)\);同理也可推得新解 \((a,c,ka+kc-b)\)。注意 \((a,b,ka+kb-c)\) 不一定合法,因為 \(ka+kb-c\) 的正負無法確定。
I - Invisible Integers:從后往前依次放數,記 \(f(i,p,j,q,s)\) 表示后面最近的朝左限制是 \(i\) 且匹配了 \([0,p)\),前面最近的朝右的限制是 \(j\) 且匹配了 \([q,len_j)\),當前還沒有開始匹配的限制集合為 \(s\)。預處理 \(g(i, j)\) 表示 \(i\) 限制的下一個限制是 \(j\) 時至少需要匹配 \(i\) 中的 \([0,g(i,j))\),轉移時有兩類,一類是放數,它必然是兩個限制之一的將要匹配的數;另一類是換下一個限制。狀態總數 \(O(2^{10}\times 10^4)\),總轉移復雜度 \(O(2^{10}\times 10^5)\),但它就是能過。
J - Jazz Journey:把所有點對分開處理,類似括號匹配的貪心。
L - Lost Logic:限制越多解越少,因此把所有合法限制加上,暴力枚舉解個數是否 > 3。但是當我莽完交上去才發現 \(m\leq 500\),注意到強連通分量個數 \(\leq 2^3 = 8\),因此每個強連通內部連成環,最多只會有 \(2n+64\) 條邊。
N(2015-2016 ACM-ICPC, Central Europe Regional Contest (CERC 15))
C - Cow Confinement:考慮把牛到花的路徑唯一化,即先盡量往右走,再盡量往下走。這樣做的好處是,如果從右往左做掃描線,大多數路徑都不會變化。維護時首先把新加入的矩形豎邊界所在行清零,然后維護新加入的花的影響。如果矩形豎邊是左邊界,則矩形左下角還會對矩形下邊界往上的點產生貢獻,但是這樣會算重,還要減去矩形右下角還會對矩形上邊界往上的點的貢獻(注意線段樹的范圍要開大點,否則會訪問到非法位置)。
E - Export Estimate:大多數情況下刪二度點后,其他點的度數不變,此時對於某張固定的圖操作后點數為 \(n-deg_2-deg_0\),邊數為 \(m-deg_2\)。然而有一個例外,就是刪出了自環。自環不被刪,所以這對非二度點不影響(本來就不刪它),但是對於一個簡單環,它最后會變成單點單邊,因此最后的點數與邊數還要加上簡單環個數。再並查集維護一下簡單環個數(維護兩個東西:點的最大度數,點數與邊數之差)即可。
F - Frightful Formula:考慮計算貢獻,\(l_i,t_i\) 的貢獻是平凡的。對於 \(c\),它的貢獻為 \(\left(\sum_{i=0}^{n-2}\sum_{j=0}^{n-2}\binom{i+j}{i}a^ib^j\right)\times c\),可以將 \(j\) 有關的項提出來,發現是 “下降冪 × 等比” 的形式,直接錯位相減。
然而從組合意義出發(走格子),可以得到如下
(我也不知道為什么)的式子:\[\sum_{i=0}^n\sum_{j=0}^n\binom{i+j}{i}a^ib^j=\sum_{i=0}^{2n}(a+b)^i-\sum_{i=0}^{n-1}\left(\sum_{j=0}^{i}(a+b)^j\right)\times\binom{2n-i-1}{n}\times(a^{n+1}b^{n-i-1}+a^{n-i-1}b^{n+1}) \]
感覺組合恆等式太頭疼了,溜了溜了。
G - Greenhouse Growth:如果某一時刻相鄰的植物高度相同,那么它們接下來將一直相同。因此只需要每次修改后找到新的相鄰高度相同的植物,並將它們合並,可以用 鏈表 + 並查集 + set/帶刪優先隊列 實現。實現時注意某次修改后可能有多次合並,比較麻煩。
I - Ice Igloos:暴力找到所有可能的圓心。不知道為啥本機過了交上去過不了了,改成 long long 才過。
J - Juice Junctions:顯然最小割樹,保證了最小割 \(\leq 3\)。最小割為 \(0\) 或 \(1\) 的情況是平凡的,考慮最小割為 \(2\) 的情況,如果枚舉源點 dfs 需要 \(O(n^3)\)(認為 n, m 同階)的時間。但可以反過來枚舉最小割中的一條邊,刪掉這條邊后,任意新增的橋一定和這條邊形成大小為 2 的最小割,這樣就可以 \(O(n^2)\)。
L - Looping Labyrinth:稱每個 \(n\times m\) 為 “大塊”,原點所在大塊坐標 \((0,0)\)。只考慮每個大塊的邊角連通塊,則一個大塊內部的總連通塊個數為 \(O(n+m)\)。考慮在連通塊之間連邊,表示從連通塊 \(A\to B\),大塊坐標對應變化 \((\pm 1,0)\) 或 \((0,\pm 1)\),則只要存在一條(不一定簡單)路徑從詢問點到原點,使得路徑對應的大塊坐標與詢問的大塊相同即可。可以將其拆成一條簡單路徑 + 若干簡單環,那么只需要先 \(O(n+m)^3\) 求出有用的簡單環,再將這些簡單環合並(合並的方法可以考慮實際意義,發現是一個不定方程組)。
口胡到我自己都看不懂自己在寫什么。
O(2014-2015 ACM-ICPC, Central Europe Regional Contest (CERC 14))
A - Parades:把路徑放在 lca 處理,可以進行 dp,發現在每個結點處需要做一個一般圖最大匹配,由於點度數 \(\leq 10\) 所以狀壓即可。
B - Mountainous landscape:如果二分,則只需要查詢區間凸包 + 二分求切線,但復雜度為 \(O(n\log^3n)\)。考慮直接線段樹二分,則復雜度降為 \(O(n\log^2n)\),可以通過該題。
E - Can't stop playing:考慮直接暴力。每時刻的狀態一定是峰形,如果直接存則狀態總數 \(O(2^{26})\)。考慮只存峰形的一半,另一半可以用總和減去一半,那么狀態總數即 \(O(2^{13}\times n)\)。轉移可以做到 \(O(1)\),只需要知道最高 bit 與最低 bit 即可。
G - Virus synthesis:建出 PAM,對所有偶回文子串 dp。轉移兩種:一種從長度 ≤ len / 2 的偶回文后綴轉移,倍增找即可;一種不是從后綴轉移,則可以把兩端去掉,因此就是 PAM 的父親轉移過來。不知道能不能線性。
J - Pork barrel:由 kruskal 的過程可知,給定下界后最小生成樹唯一,且下界增加最小生成樹的形態總變化量為 \(O(m)\),於是可以用可持久化線段樹維護。現只需考慮求出每次應該使用哪條邊替換最小邊,可以去求每條邊換掉了哪條邊,把換掉的那條邊刪掉,然后把新邊加進去。可以發現按從小到大的順序替換即可,掃一遍用 lct 維護即可(多測不清空,*****)。
K - The Imp:二分答案,判斷最終答案是否可以 \(\geq mid\)。等價於是否可以選擇 \(k + 1\) 個物品滿足 \(v_i - \sum_{j\leq i} c_j\geq mid\)。注意到物品順序可以提前貪心排好(交換論證可得),因此排好序做 \(O(nk)\) 的 dp 即可判斷,總時間復雜度 \(O(nk\log A)\)。
L* - Outer space invaders:區間 dp,枚舉最大的攻擊在哪個時刻,它的貢獻一定是 \(\max\{d_i\},[a_i,b_i]\sub [l,r]\)。
P(2013-2014 ACM ICPC Central European Regional Contest (CERC 13))
A - Rubik's Rectangle:把相互可達的 4 個格子(特判 n, m 為奇數的情況)一起處理,有 4 種翻轉會影響它們,它們都會改變這 4 個格子之間的逆序對奇偶性。因此可以決定行列翻轉次數的奇偶性,如果奇偶性合法則一定有解。輸出方案有點麻煩。
D - Subway:輸入看着有點麻煩。建出圖后需要跑雙關鍵字最短路,不過寫完dijkstra發現邊權有負的冷靜一下發現 bfs 即可代替最短路的過程。
E - Escape:轉化成 “先損失 \(a\) 再收益 \(b\)” 的形式,將終點收益設為 \(+\infin\),做樹上貪心(即每次取出最優的點與父親合並)判斷最后是否需要先損失才能遍歷完樹上所有點(p.s.:延遲刪除的堆一定要寫嚴格偏序)。
H - Chain & Co.:把矩形按法向量方向分為三類,則每一類必須分到一起。於是只需要判某兩類是否相容,這個隨便模擬一下就好了。
J - Captain Obvious and the Rabbit-Man:如果找到一組 \(b_{1\dots k}\),使得對於 \(F_{1\dots k}\) 都滿足 \(F^{k+1}=\sum_{i=1}^{k}b_iF^i\),則有 \(p(k+1)=\sum_{i=1}^{k}b_i p(i)\)。由於 \(F_{1\dots k}\) 是 \(f(x)=x^{k+1}-\sum_{i=1}^{k}b_ix^i\) 的根,所以有 \(x^{k+1}-\sum_{i=1}^{k}b_ix^i=x(x-F_1)(x-F_2)\dots(x-F_k)\),直接 \(O(k^2)\) 展開即可。
Q(2017-2018 ACM-ICPC, NEERC, Northern Subregional Contest)
E - Equal Numbers:將數分為兩類,一類是有倍數的,一類是沒有倍數的極大值。兩種情況:要么只動有倍數的,把這些數改成極大值;要么全部都可以動,把這些數改成所有數的 lcm,這種情況需要多操作一次。把這些數的出現次數從小到大排序然后貪心取即可。
F - Fygon 2.0:依大小關系建圖,縮強連通,則 \(k\) 即 DAG 點數,而 \(C=\frac{cnt}{k!}\)(其中 \(cnt\) 是合法拓撲序數量,狀壓即可)。
G - Grand Test:如果存在不是單邊或簡單環的點雙,則一定有解。構造方法即取出該點雙的任一簡單環,必然存在另一不屬於簡單環的路徑從環上一點到另一點,這樣就有 3 條路徑了。
H - Hidden Supervisors:先給每棵樹內部找個最大匹配(貪心地從葉子開始匹配),如果根沒有匹配,則它可以與其他樹中未匹配點匹配。考慮先將有匹配根的樹與 1 號點所在樹連接,然后嘗試將未匹配根的樹與 1 號點所在樹中未匹配點連接。如果剩下 > 1 個沒有匹配的根(此時一定沒有未匹配的非根結點),可以把 1 號點所在匹配拆開,分別與兩個未匹配根相連,消掉兩個沒有匹配的根。sort 如果傳入一個非嚴格偏序關系會 RE 而不是 WA。
J - Joker:經典分塊維護凸包,最優應該可以做到 \(O(n\sqrt{n\log n})\)。在凸包上二分時注意取較小的那個位置。
R(2016-2017 ACM-ICPC, NEERC, Northern Subregional Contest)
B - Boys and Girls:特判全為 B/G 的情況。設 cntB = cntG = cnt 表示極大連續的 B/G 段數,設 sumB, sumG 表示 B/G 的總個數,設 oneB, oneG 表示單獨一個 B/G 成段的數量。列方程,發現可以先解出 sumB, sumG。於是枚舉 cnt,求出 oneB, oneG 的范圍判斷是否有解。構造根據以上信息隨便怎么構造即可。
D - Digital Addition:簡單 dp,模擬判斷決策是否可行。
E - Easy Reading:滑窗,當兩張圖點數相等時再判斷是否同構,這樣只會判 \(O(l)\) 次同構。考慮將點排序,對 x,y 兩維分別字符串 hash。為了讓兩張圖左上角對齊還需要平移一個向量,發現這種 hash 是可以支持平移的。用平衡樹維護一下 hash 值即可。
G - Gangsters in Central City:維護根的每棵子樹內的所有點的 lca。
I - Integral Polygons:等價於求叉積之和為偶數的方案數。求一下叉積的前綴和,線性掃描 + 隨便維護一下(不清楚為什么在 OJ 上過不了 現在好像過了)。
J - Java2016:不斷取 \(\max\) 幾乎可以 100% 得到 255,利用宏大概可以對 \(2^{13}\) 個隨機變量取 \(\max\),剩下的只需要搞個類似快速冪即可。
S(2015-2016 ACM-ICPC, NEERC, Northern Subregional Contest)
D - Distribution in Metagonia:只需要讓構造出來的 3 的冪次嚴格遞減即可。
F - Fygon:就硬模擬。不清楚怎么簡單算,反正我寫了個自然數冪和。
I - Insider's Information:考慮隨機調整,依次考慮所有限制,以一定概率將排列修改成滿足該限制(最多只需要交換一次即可)。最后判斷是否有足夠數量的限制滿足要求,如果不夠就再來一遍。不知道正確率咋算,看起來很優。
G - Graph:比較 trivial 的貪心。找到當前所有入度為 0 的點,從小到大依次加 “入邊”(先不去確定入邊對應的點),比較最大的入度為 0 與現在需要加 “入邊” 的最大點,如果是入度為 0 的點大則直接加入拓撲序,否則拓撲序上一個點向需要加 “入邊” 的最大點連邊。
T(2014-2015 ACM-ICPC, NEERC, Northern Subregional Contest)
C - Combinator Expression:由於題目告訴你正規形式保持不變,而只有 "K" 算子才會刪掉其他算子,所以只要 "K" 算子刪掉的盡量多即可。然后你發現從左往右執行算子一定最優(如果先內部執行算子的話,"K" 算子能夠刪掉的會變少),建樹出來模擬即可。
E - Expression:首先你得會把正則表達式轉 \(\epsilon-NFA\)(注意它的參數可以是空的正則表達式)。預處理 起始結點匹配到某個點 / 某個點匹配到終止結點 的最短串以及對應方案。然后在上面跑 \(O(|E|\times|S|)\) 的 dp 求出最短長度,注意不能存 \(O(|E|\times|S|)\) 的方案,但是中間部分是已知(即需要匹配的模式串),所以也不需要存。MLE 原因:vector 的 clear 函數不清空內存。
F - Fragmentation:離散化,縮相同連續段。則 \(a_{i}\) 與 \(a_{i+1}\) 之間不切斷的充分條件為 \(a_{i+1}=a_i+1\),且每對相鄰權值 \((k, k + 1)\) 在原序列中只能對應不切斷一個地方。如果 \((k-1,k),(k,k+1)\) 在原序列中不切斷的地方相鄰,則 \(k\) 的出現次數必為 1。因此出現次數為 1 的權值之間可能會有約束(選 \(a\) 不能選 \(b\))。構造方案時從左往右,先處理出現次數為 1 的權值,具體看代碼(你馬的,少一行 break 調 1h)。
H - Hiking in the Hills:從一個面走到另一個相鄰面,一定走兩者交集的最低點最優(這個點一定是頂點)。路徑上最高點一定是在面面之間產生,而不是在面內產生(因為總是走直線),因此變成最小生成樹問題。
K - Kebab House:預處理出 \(f_{i,j}\) 表示 \(i\) 個位置塞 \(\leq j\) 個白日夢,要求最后一個必須塞的方案數,這部分 \(O(q^3)\)。對於 \(n\) 個段,定義 \(g_{i,j}\) 表示到第 \(i\) 道菜,還要過 \(j\) 時刻才能繼續做夢。枚舉第 \(i\) 道菜最后一個白日夢,利用 \(f\) 轉移,這部分 \(O(nqt)\)。注意第 \(i\) 道菜可以不做夢。
U(2013-2014 ACM-ICPC, NEERC, Northern Subregional Contest)
C - Correcting Curiosity:字符串哈希,可以 \(O(n^2)\) 處理出按題目所給方法刪掉子串 \([l, r]\) 的所有出現位置的哈希值(在段與段之間用特殊字符隔開),兩個串都這么處理,哈希值相同的可以作為答案。注意有個串可以為空。(然后我 TM 常數大得不正常,導致我把雙哈希的兩取模換成一取模一自然溢出才 1.9s 勉強卡過)
H - Heavy Chain Clusterization:經典最小割。
J - J:把所有量存成 \(f(X)=\sum_{i\leq 10} a_i X^i\) 的形式,預處理 \(s_i = \sum_{j=1}^{N} X_j^i\),然后模擬。
L - Lonely Mountain:有解當且僅當兩平面最高高度相同。可以把貢獻拆解成若干對三棱柱的交,手推一下 + 排序掃描即可。p