2023牛客暑假多校 Day1
D
SB题
J
麻, 自己看了快十分钟还不会做就离谱, 队友哥写的。
观察到每次赢都是增加 \(1\) 的钱, 那直接按照钱从小往大 DP, 转移本质不同的只有 \(\log\) 段, 快速幂转移一下就完了。
K
直接搞 bfs 树, 每个点数一下返祖边, 讨论一下叶子结点要不要伸长就搞完了。
H
考试的时候讨论半天给人讨论傻了最后没给个做法,看看群发现退役一年是真的变成 SB 了。
\(\Delta = |a_i - b_j| + |a_j - b_i| - |a_i - b_i| - |a_j - b_j|\)
后面两项只和 \(i, j\) 有关, 考虑拆开前面的绝对值使得 \(i, j\) 独立。
对于一查询点 \((a_i, b_i)\) 考虑把 \((b_j, a_j)\) 存进数据结构, 对左下, 左上, 右下, 右上开四个数据结构移项查询一下即可。这个直接线段树搞搞就行。
赛时 aw 编了一个和正解可能差不多的东西, 没有搞懂, 听 mg 讲也没懂, 但是自己后来又搞出来了。
就是先把这东西 分成 \(a_i < b_i\) 和 \(a_i > b_i\) 两类, 只有这样的交换才可能有贡献。
然后放到数轴上, 如果两个区间没有交集是没用的, 有交集或者包含是有用的, 也就是交换以后答案会变小, 且变小的大小就是两个区间交集的两倍。
那这个就很容易做了, 把区间按照右端点从大往小排序, 维护前缀最小左端点即可。
Submission #214210498 - Codeforces
L
excrt板板, 没开到, 血亏。
M
妈的, 赛时会了然后一直挂, 给大家找个不同。
下面是我赛时的代码
auto gt = [&] (i64 d) -> void {
i64 m = b * d + x0, n = y0 - a * d;
if (m >= 0 && n >= 0) ans = std :: min(ans, 2 * (m + n));
else ans = std :: min(ans, 2 * (abs(m) + abs(n)) - 1ll);
} ;
下面是 AC 代码
auto gt = [&] (i64 d) -> void {
i64 m = b * d + x0, n = y0 - a * d;
if (m >= 0 && n >= 0) ans = std :: min(ans, 2 * (m + n));
else ans = std :: min(ans, 2ll * (abs(m) + abs(n)) - 1ll);
} ;
玉玉了, 真的玉玉了。
做法很简单, 直接 exgcd 即可。
A, B
对我来说不可做
C
这个是不是应该当套路记录下来。
令 \(a = bk + c\) 。
-
对于操作一, 令 \(c_{i + 1} = c_i + x\)
-
对于操作二, 如果 \(a_i \geq k\) 让 \(c_{i + 1} = c_i - k\), 否则让 \(c_{i + 1} = c_i - k, b_{i + 1} = b_i + 1\) 。
那么所有操作以后 \(b_m = ceil(\frac{min_ic_i}{k})\) 。
那么使用一个维护区间历史最值的线段树即可简单维护。
E
什么超级加强版 slope trick
F
计算几何, G
G
不是人做的, G