XXI Opencup, Grand Prix of Korea
XXI Opencup, Grand Prix of Korea
OpenCup强度这么大吗(
A
根据 Hall 定理, 把 \(a\) 从大到小排序对于 \(\forall x \in [1, n]\) 如果有 \(\sum_{i = 1} ^ xa_i \leq \sum_{i = 1} ^ m \min \{x, b_i\}\) 则等价于可以分发完全。
使用线段树维护 \(\forall x \in [1, n], \sum_{i = 1} ^ m \min \{x, b_i\} - \sum_{i = 1} ^ x a_i\) 。对 \(a_i\) 修改的时候直接改维护一下顺序就是, 对 \(b_i\) 改的时候也是一个区间修改, 维护一下全局最小值。
D
对于任意三元组, 要求三边最小值不唯一, 换言之, 三元组可拆成两条链, 使两条链上最小值相等。
然后开始猜。
完全图的东西构造出来一般总和生成树有点关系, 最小生成树好像没用, 最大生成树好像有点神秘的性质。
对于最大生成树上的点 \(i, j, k\) 有 \(w(i, j) \leq \min \{ w(j, k), w(i, k) \}\) 。假设 \(i, j, k\) 相邻, 则 \(w(i, j) \geq \min \{ w(j, k), w(i, k) \}\) , 把不等式推一下, \(i, j, k\) 不相邻, 后者同样成立。 那这样限制就很强了。
构造最大生成树, 判断链上最小值是否等于每条非树边即可判断是否合法。答案在建立树的时候顺带算完, 连通块之间的边直接设成 \(1\) 就好。
H
先考虑怎么判断一个数 \(t\) 是否合法。
从大往小考虑, 需要 \(t - 1, t - 2, t - 3 ...\) 。
对于 \(t - 1\), 需要 \(t - 2, t - 3, t - 4...\) 。
从大到小考虑, 每次贪心分配一下就搞完了。
答案显然可以二分, 注意特判 \(1\) 。
K
直接 sort 一下倍长就完事了。 咋签到题通过数这么少啊。
J
离线所有操作, 把模拟机器人变成模拟起点移动, 用个 map 存每个位置有哪些询问, 每次起点撞到机器人就把机器人往移动方向推, 合并的时候启发式合并即可。
F
以前做过的费用流题, 用 Dijskra 优化的费用流跑跑。
没法直接跑 spfa 重赋权, 发现图是个 DAG, DP一下即可。
I
咋感觉好像考过。
带权dfs序(把点 \(i\) 写 \(A_i\) 遍)的中位数在重心的子树里面。 找到这个点向上倍增找重心完事。
这一性质成立显然, 因为重心子树对应的区间长度必定大于一半。
E
题目是问有多少个区间的导出子图是一条链。
BZOJ 上好像有问有多少个区间的导出子图是一棵树还是说没有环来着的版本, 直接用一个 LCT搞定。
考虑这个题是链, 尝试加强限制。
- 没有环, 这个用 LCT 搞定, 枚举右端点, 判断合法的左端点可以去掉段前缀
- 没有度数大于2的点, 扫右端点的时候维护一下度数, 也可以去掉一段前缀。
- 边数等于点数 - 1。 令 \(c_i\) 表示 \([i, r]\) 导出子图的边数, \(i\) 合法当且仅当 \(r - i = c_i\) ,维护 \(c_i + i\), 因为边数只会少不会多, 查询最大值和最大值个数即可。
麻了, 老年人不会写代码挂了114514发。
G
一眼 DP of DP。
先考虑判断, 设 \(f_{i, j}\) 表示考虑前 \(i\) 个, 目前 LCS 长度为 \(j\) 最靠前匹配到的位置, 由于 \(j \geq i - 3\), 且这个位置和 \(i\) 也只相差 \(3\) , 把这个位置也压进状态进行 DP。设 \(f(i, a_0, a_1, a_2, a_3)\) 表示当前匹配到 \(i\), 长度为 \(i - t\) 的LCS最靠前的匹配位置和 \(i\) 的距离, 枚举转移即可。
不会做了要给cy打工了不做了