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\) 合法当且仅当以下式子成立:

\[\large sum_{pos-len+1,pos}+res-x<len(A_i+x+1) \]

上式的含义表示 \(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)\)

posted @ 2024-09-29 14:34  -wryyy-  阅读(175)  评论(0编辑  收藏  举报