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
签到