ABC344

怎么越来越菜了呢?

ABC比较一眼。

D

\(dp_{i,j}\) 代表考虑完前 \(i\) 个包取得 \(T\) 的前 \(j\) 个前缀的最小代价。

暴力枚举转移即可。

code

E

\(pre_i\)\(nxt_i\) 分别代表 \(i\) 的前驱和后继。

维护一下头指针即可。

F

感性题。

首先将二维点变成一维点。

\(dp_i\) 代表走到 \(i\) 的最小步数,和在最小步数的基础上的最大钱数。

我们考虑枚举最后一个停留的点进行转移。

转移较为简单,我们先说为什么一定要将步数最小化。

一个显然的结论就是停留的点中 \(p_i\) 单调递增。——syz&ly

假设你第 \(i\) 个停留的点满足 \(p_i>p_{i+1}\),那肯定可以在 \(i\) 把后面的都选了。

感性理解一下发现是对的。

说回转移。

我们预处理出 \(dis_{i,j}\) 代表 \(i\rightarrow j\) 在不停留的情况下能剩余的最大钱数(可以小于 \(0\))。

我们假设最后一个停留的点为 \(j\)。那么我们的路线就是 \(1\rightarrow j\rightarrow i\)

前面那段的信息就是 \(dp_j\)。关于后面,我们可以根据 \(dis_{j,i}\) 和前面那段的剩余钱数处理出最少停留几次,和 \(j\rightarrow i\) 的曼哈顿距离加入到行动次数中。钱数也可以在这个过程中处理出来。

注意原则:步数尽可能小的前提下钱数尽可能大。

多感性理解即可。

code

G

观察一下式子 \(Y\ge A\times X+B\)

可以得到 \(Y-A\times X\ge B\)

一个自然而然地想法就是按照 \(Y-A\times X\) 排序,询问时二分。但是这样显然会 T。

考虑对于 \((X_1,Y_1)\)\((X_2,Y_2)\),当 \(A\) 增加时,它们地相对顺序至多会改变一次。

首先若 \(X_1=X_2\),它们不会改变顺序。

不失一般性地假设 \(X_1> X_2\),当 \(A=-\infty\) 时,用初等数学的眼光看待会发现按照 \(X_i\) 递增排序。

考虑一下第一次交换是什么时候。交换说明 \(Y_1-A\times X_1> Y_2-A\times X_2\),推一下式子。

\[Y_1-Y_2>A\times X_1-A\times X_2 \]

\[Y_1-Y_2>A\times (X_1-X_2) \]

由于我们已经按照递增排序,所以存在 \(X_1-X_2<0\)

\[\frac{Y_1-Y_2}{X_1-X_2}<A \]

假如说存在第二次交换。

\[Y_2-A\times X_2>Y_1-A\times X_1 \]

仿照上面的方法,发现 \(\frac{Y_2-Y_1}{X_2-X_1}>A\)

变形,\(\frac{Y_1-Y_2}{X_1-X_2}>A\)

由于 \(\frac{Y_1-Y_2}{X_1-X_2}\) 是一个定值,而 \(A\) 又在递增,所以不可能存在第二次交换。

于是我们发现两点只会交换一次,总交换数不超过 \(n^2\)

所以我们只需要维护这些交换即可,怎么维护?

上面我们已经推出了交换的条件:\(\frac{Y_1-Y_2}{X_1-X_2}<A\)

用堆维护一下两点之间的斜率即可。

什么sb代码调不出来一点

由于存在精度问题,所以直接除会产生问题,应该通过数学知识变成乘法。

posted @ 2024-03-10 01:04  BYR_KKK  阅读(44)  评论(0编辑  收藏  举报