ABC344
怎么越来越菜了呢?
ABC比较一眼。
D
令 \(dp_{i,j}\) 代表考虑完前 \(i\) 个包取得 \(T\) 的前 \(j\) 个前缀的最小代价。
暴力枚举转移即可。
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\) 的曼哈顿距离加入到行动次数中。钱数也可以在这个过程中处理出来。
注意原则:步数尽可能小的前提下钱数尽可能大。
多感性理解即可。
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\),推一下式子。
由于我们已经按照递增排序,所以存在 \(X_1-X_2<0\)。
假如说存在第二次交换。
仿照上面的方法,发现 \(\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代码调不出来一点
由于存在精度问题,所以直接除会产生问题,应该通过数学知识变成乘法。