Loading

Zhengrui noip 十连测 总结

Round 1

调配

我们设 \(f_{i, j, k}\) 为到 \(i\) 总和为 \(j\) 且选的个数为 \(k\) 的方案数,显然背包转移,然后最后算答案算个平均值即可。

运输

我的赛时想法是在 dijkstra 维护 DP 数组 \(f_{i, j}\) 表示到了 \(i\),最小边权为 \(j\) 的最短路是多少,但是注意到边数很多,点数很少,本质上有相当多的状态是无用的,我们用 set 来维护这些状态,每次松弛一个点时顺便把无用状态给删掉。具体复杂度未知,但能过。

题解做法是跑 floyd 从小到大加边做,但说实话我没看懂。

考试

公式化做题就是快。

考虑概率互不影响,我们把所有 \(l_i, r_i\) 给分割成一个个区间,依次考虑每个数在哪些区间里,考虑把剩下的数分为 \(2\) 类,一类是在这个区间之外,一类是在这个区间之内,DP 是很容易的,但是你发现复杂度是 \(O(n^5)\),很不好。

每次对于枚举区间相同的情况,我们其实都是扣掉一个位置做背包,我们将 DP 转移换元后即可发现是可以删除某个位置的元素,因此 \(O(n^4)\) 做完了,需要注意当 DP 转移系数是 \(0\) 的时候就不能将对应的那项作为主元进行撤销了,因此 \(3\) 个系数都得跑一遍。

网络管理

假设只有 \(2\) 操作怎么办。

显然,我们可以以 DFS 序为一维限制,深度为一维限制,做二维数点求和解决。

那么,我们加上 \(1\) 操作怎么办,我们可以新加一维时间维,用 CDQ 分治离线解决。

最后考虑如果有 \(3\) 操作怎么办。

这个问题被转化为了二维平面矩形加,矩形查,可以用二维分块或者直接使用 KDT 达到根号的复杂度,同时由于可以离线,KDT 不需要二进制分组了,直接离线先建完就好。

Round 2

Angel

场上这个题打唐了,只考虑了一种情况,没有递归去做而是直接贪。

比较正确的做法是,显然一个位置被交换两次没有意义,从高位到低位考虑,然后最前面的和最后面(二进制下这一位为 \(1\))的交换显然是不劣的,去掉最高位,发现这个过程可以不断进行,只需要看操作是否被用完即可。

较好的实现可以做到单次 \(O(\log n)\)

Bunny

这个题也比较唐,但是我做了好久。

你发现 \(a\) 确定之后,答案会是什么。

就是每个值域连续段除了最大的数之外的数的个数总和,我们要最小化这个东西。

看到值域其实是比较小的,然而答案是 \(O(n)\) 级别的,所以肯定是考虑从值域入手。

你发现一个较为关键的性质是,所有相同值一定是同时进行操作的,不然的话答案不会更优(你考虑假设一边不动)。然后你发现一个事情,就是它只会使用 \(-1\) 操作,因为使用 \(-1\) 操作足以达到将一个连续段断开的目的,使用 \(+1\) 操作纯纯浪费。

于是你设 \(f_i\) 为考虑到值域为 \(i\) 时的 DP,转移如下:

\[f_i = \min(f_{i - 1}, f_{i - 2} + cnt_{i - 1}) \]

显然第一种就是不操作,第二种就是花费 \(cnt_{i - 1}\) 次操作将 \(i - 1\) 全部变为 \(i - 2\)

我感觉这种唐题比 T1 还要简单些。

posted @ 2025-09-03 16:48  Alexande  阅读(35)  评论(0)    收藏  举报