CF1928E 题解

2300?1300!

\(\textbf{Problem Statement}\)

给定 \(n,x,y,s\),构造长度为 \(n\) 的序列 \(a\),满足:

  • \(a_1 = x\)

  • \(\forall i \in [2,n],a_i = a_{i-1} + y\) 或者 \(a_i = a_{i-1} \bmod y\)

  • \(\sum \limits_{i=1}^n a_i = s\)

给出构造或报告无解。\(\sum n,\sum s \le 2 \cdot 10^5\)

\(\textbf{Hints}\)

\(\textbf{Hint 1}\)

\(p = s - n \cdot (x \bmod y)\),如果 \(p \bmod y \ne 0\),这个问题可能有解吗?

\(\textbf{Hint 2}\)

\(s = \dfrac{p}{y}\),问题等价于构造序列 \(a\),使得 \(a_1 = x\)\(\forall i \in [2,n],a_i = a_{i-1}+1\)\(a_i = 0\),且 \(\sum \limits_{i=1}^n a_i = s\)

\(\textbf{Hint 3}\)

解决 \(x < y\) 的情况。\(x \ge y\) 的情况可以简单转化。

\(\textbf{Hint 4}\)

\(x < y\) 时,鉴于你可以填 \(0\),你只需要关心拼出一个整数 \(q\) 最小需要几个数字。

\(\textbf{Hint 5}\)

可以用 DP 解决。

\(\textbf{Solution}\)

先阅读完所有提示。

我们来解决 \(x < y\) 的情况,此时我们关心拼出整数 \(q\) 最少需要几个数字。考虑图论建模,对于数字 \(i\),向 \(x = i+\sum\limits_{j=1}^k j\) 连边权为 \(k+1\) 的边,表示从 \(i\)\(x\) 需要 \(k+1\) 个新的数字,容易发现边数为 \(\mathcal O(n \sqrt n)\) 级别。跑一边 dij 即可得到拼出每个整数的最少代价,复杂度 \(\mathcal O(n \sqrt n \log n)\)

你发现这个图是个 DAG,边即为 dp 的转移方程,那么直接 dp 就好,复杂度 \(\mathcal O(n\sqrt n )\)

然后我们就 \(\mathcal O(1)\) 解决了 \(x < y\) 的情况,对于 \(x \ge y\) 的情况,我们只需要枚举第一部分填几个数字,然后就转化成了 \(x < y\) 的情况。

构造答案只需要记录 dp 方案,这也是容易完成的。回答每组询问的时间复杂度是 \(\mathcal O(n)\),可以通过。

赛时代码。因为脑抽了所以写了 dij。

posted @ 2024-02-11 20:35  sunkuangzheng  阅读(15)  评论(0编辑  收藏  举报