联考test1009

写在前面的话

感觉比以往的比赛难多了。出题人卡高精度,不好评价,但是题目还是好题。

考试的时候开题顺序为 \(T1-T3-T4-T2\) ,感觉和题目的实际难度排序差不多。

实际得分 \(80+0+100+0=180\) ,总体排名 \(rk 29\)

今天发现外省的选手都很强大啊,之后的路很长。

题目或许需要保密,所以不给予题目描述。

\(T1\)

思路点拨

比较结论的一题,容易知道的是,在 \(1 \leqslant i \leqslant n\) 中, 不同的 \(f(i)\)\(O(\sqrt n)\) 这个级别上。

我们可以预处理处每一个 \(f(i)\) 相同的连续段,这个是十分具有规律的,我们可以打表得出这个规律。

对于一组询问,我们可以暴力遍历这 \(\sqrt n\) 个连续段,我们对于一个连续段 \(l,r\) ,我们希望求出有多少个非负整数 \(x\) 满足 \(l \leqslant k+xm \leqslant r\) ,每一组合法的 \(x\) 会产生 \(f(l)\) 的贡献。

利用不等式的知识可以得出,\(k\) 的下界是 \(\lceil \dfrac{l-k}{m}\rceil\) ,上界是 \(\lfloor \dfrac{r-k}{m}\rfloor\) ,所以单次询问可以做到 \(O(\sqrt n)\)

期望得分 \(100\) ,但是本题需要高精度或者 int128 ,所以只有 \(80\)

\(T2\)

emm,看来这是本场最困难的题目。不会。

\(T3\)

思路点拨

唯一场切的题。我们考虑弱化问题,使得 \(a_i<L\)

这是一个经典的问题,我们将 \(a\) 从小到大排序之后,答案就是 \(\prod_{i=1}^n a_i-i+1\) 。证明略。

我们可以将一个数拆分为两个部分,一部分是 \(0,1,...,a_i-a_i \bmod L-1\) ,二部分就是 \(a_i-a_i \bmod L,...,a_i-1\) 。我们发现,对于一个数,如果其存在一部分,那么这个一部分会长于全部的二部分。所以我们优先填一部分。假设我们在第二部分填了 \(j\) 个,那么第一部分(假设下标集合为 \(S\) )的贡献就是:

\[(\prod_{x \in S} \lfloor \dfrac{a_x}{L}\rfloor)(\prod_{i=L-j}^{L-n+1} i) \]

这个式子我们理解一下,第一部分就是描述了每一个余数的选择,如果一个数为 \(x\) ,那么在它的第二部分有 \(\lfloor \dfrac{x}{L}\rfloor\) 个完整的余数循环节 \(0,1,...,L-1\) 。所以对于每一个余数有这么多种选择。第二部分是最好理解的,我们枚举了一个位置可以选择的余数。

我们将序列 \(\{a\}\) 依据 \(a \bmod L\) 从小到大排序,之后考虑动态规划。

我们令 \(f_{i,j}\) 表示我们考虑到了下标为 \(i\) 的元素,在这之前,我们选择了 \(j\) 个元素作为第一部分。

  • \(f_{i,j}=f_{i-1,j-1} \times ((a_i \bmod L)-j+1)\) 。我们依照刚刚讲的 \(a_i<L\) 的方式填了第一部分。

  • 如果一个数选择第二部分,我们并不好维护贡献的 \(\prod_{i=L-j}^{L-n+1} i\) ,但是可以发现,这个在 \(j\) 一定的时候是一个定值,所以我们在动态规划的过程中只维护 \(\prod_{i=L-j}^{L-n+1} i\) 。固然有 \(f_{i,j}=f_{i-1,j}\times \lfloor \dfrac{a_i}{L}\rfloor\)

最后因为我们的第二部分没有算上阶乘,所以答案应该带上:

\[\sum_{j=1}^n (f_{n,j} \times \prod_{k=L-j}^{L-n+1} k) \]

总体时间复杂度是 \(O(n^2)\) 的。

\(T4\)

思路点拨

我们考虑将问题转化一下,我们有 \(n\) 个节点,点有点权 \(v_i\) 。对于第 \(i\) 个节点,要么他向点权小于等于它本身的节点连 \(a_i\) 及以上条边,可以获得 \(b_i\) 的贡献;要么他想点权大于等于他本身的节点连 \(a_i\) 及以上条边可以获得 \(c_i\) 的贡献。

我们发现,按照我们转化的题意,我们可以获得一种思考方向,就是我们将全部的节点按照点权从小到大连边,这样我们题目要求中的连边就有了方向感。

我们假设全部节点的点权是不同的,那么我们可以设计出一种动态规划,我们令 \(f_{i,j,k}\) 表示我们考虑到节点 \(i\) ,选择了 \(j\) 个节点向点权比他小的点连边,后面至多可以有 \(k\) 个节点向点权比他小的点连边。转移考虑刷表。

  • \(f_{i-1,j,k}+b_i\) 可以转移到 \(f_{i,j+1,k}(a_i \leqslant i-j-1)\) 。我们将节点 \(i-1\) 选择为连向比他小的点。

  • \(f_{i-1,j,k}+c_i=f_{i,j,\min\{k-1,n-i-a_i\}}\) 。我们将节点 \(i\) 选择为连向比他大的点。

转移式相信比较好理解,因为比较形象。时间复杂度可以做到 \(O(n^3)\)

但是这个算法不足以解决全部问题,因为这个算法建立与全部节点的点权不同的前提下。其实并没有改变很多,我们只需要将权值相等的节点一起考虑,内部再一次枚举有多少节点向比他大的连边就可以转移了。但是时间是 \(O(n^4)\) 的。

转移时可以使用后缀 \(\max\) 优化,所以做到 \(O(n^3)\)

posted @ 2023-10-09 16:00  Diavolo-Kuang  阅读(27)  评论(0编辑  收藏  举报