2019-2020 ACM-ICPC Latin American Regional Programming Contest


代碼見:

  • 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

簽到


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM