ABC373 [A-F] 题解
A September
按题意模拟即可。
B 1D Keyboard
容易发现从 A
开始然后不断按顺序走 BCD...Z
字符就是最优的。
C Max Ai+Bj
分别找出 \(\{A\}\) 和 \(\{B\}\) 中最大然后相加即可。
D Hidden Weights
原式子可化为:\(x_{u_j}+w_j=x_{v_j}\)。
无环的情况直接从无入度点搜一遍就行,考虑对于任意一个环我们如何求解。
假设该环有 \(k\) 条边,令边 \(i(1\le i\le k)\) 连接着 \(i\) 和 \(i+1\) 号节点,特别的第 \(k\) 条边为 \((k,1)\)。
由环上任意一点绕一圈回来可以得到 \(x_i+\sum_{j=1}^kw_j=x_i\)
而题目保证有解。
所以最后答案与在环上哪个点起始和取值多少无关,只要一直搜的去满足式子就行。
最后注意图可能不连通,还有从任意一点搜如果该点有入度,那么入度后的全部用反图搜。
E How to Win the Election(傻逼)
做 E 题做的特别难受,艹了,前面 4 题 20min 写完了,结果和 E 题杠到比赛结束,NM。
考虑将 \(\{A\}\) 按大小排序,可知只要加上剩余选票后大小能大于等于第 M 个的选票就一定有解,反之一定无解。
接着考虑如何最小化答案,我们令 \(i\) 为当前参选人(排序后),\(res\) 表示剩余选票数,\(x\) 表示给 \(i\) 用了多少选票,\(len\) 表示加上选票后会被重新超过至少要多少人,\(pos\) 表示第一个小于等于 \(A_i+x\) 的人的位置,\(sum_{l,r}=\sum_{i=l}^rA_i\)(排序后)。
则 \(x\) 合法当且仅当以下式子成立:
上式的含义表示 \(len\) 个人的总选票和剩余可使用选票加起来不能满足使每个人都超过 \(A_i+x\),也即第 \(i\) 个参选人不会被 \(len\) 个人超越,依然在前 \(M\) 位当中。
至于为什么上式不成立时这样一定能分配成功,这是因为,这些人的选票都小于第 \(i\) 个人的,所以总能找到一种分配方式。
显然知道 \(x\) 就可以知道 \(pos\),知道 \(pos\) 就可以知道 \(len\),所以可以对 \(x\) 二分答案,再对 \(pos\) 二分。
时间复杂度 \(O(n\log_2^2n)\)
F Knapsack with Diminishing Values
一眼 dp 题。
暴力转移是简单的,令 \(f_{i,j}\) 表示算到第 \(i\) 个人,使用容量为 \(j\),\(w_i,v_i\) 同原题,对于每个 \(j\),\(lim\) 表示最多可以放多少个 \(i\),并且满足 \(-k^2+kv_i>0\) 。
则 \(f_{i,j}=\max_{k=1}^{lim} f_{i-1,j-kw_i}-k^2+kv_i\),并且还要和 \(f_{i-1,j}\) 取 \(\max\)。
显然可以滚掉一维,写的时候注意以下枚举顺序就是了。
\(f_j=\max_{k=1}^{lim} f_{j-kw_i}\)。
然后呢?这个转移方程是暴力 \(O(NW^2)\) 的。怎么优化它?
我发现它没有前途,做不到将其优化(可能是因为我菜)。
可以考虑将 \(f_j\) 做前缀 \(\max\),以求单调性方面的优化,可是以 \(k\in[1,lim]\) 为 \(x\) 轴时,\(-k^2+kv_i\) 是单峰的并且可知峰顶横坐标,\(f_j\) 却是单调不降的,结果二者相加不满足单调性,我们没法二分或是三分。
后面实质就是引导至官方做法了。
因为 \(W\) 不大,可能会有相同的 \(w_i\),难道我们每个都要给他遍历一遍吗?这样显然是不好的。
那么我们就想,对于 \(w_i\) 相同的 \(i\),我们可不可以求出使用 \(k\) 个 \(w_i\) 时取不同的 \(v_i\) 的最大值是多少。当然可以。
但是暴力求解还是 \(NW^2\) 的,不好。但是我们还有 \(-K^2+Kv_i\) 这个式子可以入手,拆解后可以得到:
\(-K^2+Kv_i=\sum_{k=1}^{K}v_i-2k+1\)。
也就是说对于一个每多用一次 \(i\),加上的权值都是之前的权值减二。
所以我们可以把所有的 \(v_i-1\) 放入优先队列中,每取出一次就给这个值减二再放回去,这样取 \(lim\) 次就知道所有的合法 \(k\) 对应的最大值是多少。
这里的复杂度是 \(O(N\log^2N)\),两只老鸽,一只来自优先队列,一只来自调和级数。(认为 \(N,W\) 同阶,下同)
这样,我们对每个 \(w(1\le w\le W)\) 就都只会遍历一遍,总时间复杂度就为 \(O(N^2\log N)\)。