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

posted @ 2023-07-18 11:19  HN-wrp  阅读(33)  评论(2编辑  收藏  举报