代碼見:戳
- easy: EIM
- medium-easy: BDFKL
- medium: ACJ
- medium-hard: H
A - Algorithm Teaching
題意 給一些集合,現從每個集合中選出一些子集,使得被挑選的集合不是包含關系。
集合之間的包含關系是偏序關系。對 \(n\) 個集合的每個子集建點,根據包含關系連邊。根據 Dilworth's Theorem,最小鏈划分即為答案,求用最少的不交路徑覆蓋所有點即可。拆點建圖,點數 - 二分圖最大匹配,即為答案。
B – Build the Perfect House
題意 平面直角坐標系,給 n 個點,畫一個面積最大的正方形,不包含任何點。
畫一個(1,1),(1,-1)(-1,1),(-1,-1) 的正方形,轉點。二分答案,每個點會將旋轉角度限制在若干個區間的交內,如果一個位置被 \(n\) 個區間覆蓋,就 YES 了,掃描線 check 即可。
C – Cut Inequality Down
題意 第 i 天可以獲得 \(a_i\) 的金幣,金幣數超過 R,回到 R,小於 L 回到 L。多組查詢,每組查第 l 天有 x 金幣,那在第 r 天有多少金幣。
先架好 ST,對於每組查詢,二分求出下一次碰壁的時間,再二分求出下一次碰壁的時間,再二分求下一次碰壁的時間 ..... 等等,\(state(pos, 0/1)\) 表示在 \(pos\) 位置的上/下邊界這樣一個狀態,這個狀態的后繼唯一,那倍增多好啊!排骨龍才一步步跳,\(nex(pos, 0/1, k)\) 表示從狀態 \(state(pos, 0/1)\) 轉移 \(2^k\) 之后的后繼是誰。對於查詢,先從 \(B\) 開始二分求出第一次碰壁的狀態,再從該狀態倍增,求出在到達位置 \(E\) 之前最后一個碰壁的狀態是誰,從該狀態到 E 的過程,不會碰壁了,前綴和差分計算此段收益即可。
D – Dazzling Stars
題意 平面直角坐標系,有 n 個點,點有點權,需要旋轉一個角度,使得按 y 為第一關鍵字,x 為第二關鍵字從小到大排序,點權不減。
- 繞一個點旋轉所有點相當於把print的方向旋轉
- 枚舉兩個點,能將print的角度限制在一個區間,然后求所有的交
- 復雜度 \(O(n^2logn)\)
\(O(n logn)\) 做法:先考慮所有點亮度不同的情況,根據傳遞性,只需限制亮度 k 高的點位置高於亮度 k+1 高的點。再考慮有亮度相同的的點,對每種亮度做凸包,亮度值 k 高的點位置的凸包最低點,在,亮度值 k+1 高的點形成凸包最高點上方即可,求凸包切線,即可確定限制條件。
E – Eggfruit Cake
題意 給一個首尾相連的字符串,求有多少區間長度不大於S且至少有一個字符’E‘
- 尺取一哈
F – Fabricating Sculptures
題意 堆 A 個箱子,第 k 層箱子不能比第 k+1 層箱子多,最下一層有 B 個箱子,求方案數。
按層決策。\(f[i][j]\) 表示放置了 \(i\) 個格子,最上面一層有 \(j\) 個格子的方案數,\(f[i][j]=\sum_{x=j}^{S} f[i-j][x]*(x-j+1)\),預處理 \(f[i-j][🐶] 和 f[i-j][🐶]*🐶\) 后綴和即可。
G – Gluing Pictures
題意 給字符串s和t,你需要給s拍若干張照片,然后把它們按某種順序拼起來得到字符串t,求最少拍多少張照片
- 每次貪心地選擇極長的一段拍照
H - Hold or Continue?
\(f[h][c][x]\) 表示對手 \(h\) 分,我有 \(c\) 分,buffer 里有 \(x\) 分,獲勝的概率。
有兩種轉移
- hold:如果 \(c+x \leq 75\) 轉移到 \(f[c+x][h][0]\),否則轉移到 \(f[c][h][0]\)。
- continue: 枚舉🐶,轉移到 \(f[c][h][x + 🐶]\) 或者 \(f[h][c][0]\)
完蛋了,轉移成環了,但我們發現考慮 \(f[h][c][🐶]\) 和 \(f[c][h][🐶]\) 的轉移,扔掉 \(f[h][c][0], f[c][h][0]\) 的狀態,就不會成環了。
於是可以二分 \(f[c][h][0]\) 的取值 \(x\) 求解出,\(f[h][c][🐶]\),再用 \(f[h][c][🐶]\) 求出,\(f[c][h][🐶]\),根據現在的 \(f[c][h][0]\) 和 \(x\) 大小關系,調整左界或者右界。
I - Improve SPAM
題意 DAG上從1號點到其他終止點的路徑方案數
簽到
J - Jumping Grasshopper
題意 憨憨跳躍,支持修改和查詢
LCT動態維護森林並支持查詢前綴后綴比某個值大的第一個位置,可以線段樹搞一搞
敲完代碼才猛然后發現上述做法很很很假...
正解:- 直接上線段樹維護植物高度最大值,並支持查詢比某點高的植物中小於x且最大的下標以及大於x且最小的下標
- 對於每次查詢要么直接從當前點溜走,要么從左右兩區間最大值的極小者的右側(左側)的一個點(或不存在)溜走, 可以想象兩根高柱子把自己夾在中間
注:當然還有更卜的做法,比如線段樹亂搞,就是比較難寫,就不贅述了~
K – Know your Aliens
題意 對於多項式 \(P(x)\) 給出 \(P(2),P(4)....P(2n)\) 是正數還是負數。構造 \(P(x)\)
先根據零點存在定理,構造零點的序列 \(\{a_i\}\), \(P(x)=\prod (x-a_i)\),\(P(x)\) 或者 \(-P(x)\) 即為所求。
L - Leverage MDT
題意 給一個 01 矩陣,可以選擇一些行翻轉。最大化全為 1 的長寬相等的子矩陣
- 按列枚舉
- 對於每一列正反跑兩遍單調棧即可
M - Mountain Ranges
題意 最長的連續字段,相鄰差不超過x
簽到