2025.2.15 noip模拟赛
T1
题目大意:
有一个互不相同数组,现请你找出一对整数 \(x,d\),使得能找到一个长度为 n 的排列 p,使得 \(a_{p_{i}} = ((i-1) \times d+x) \mod m\),输出任意一组解即可。
\(n \le 10^5,m \le 10^9+7\), \(m \in p\),\(0 \le a_{i} < m\)。
解题思路:
首先考虑当 \(2 \times n \le m\) 时,任意找一对整数,设他们差是 \(kd\),其中 d 为公差,那么考虑快速求出 k。
考虑 \(a_{i}\) 中只有 \(n-k\) 对整数满足差值为 \(kd\),所以这样就能快速地求出 k。
但当 \(2 \times n > m\) 时,这是错的。
因为我们可能会出现整数 \(i\), 假设他们在最终的序列里的位置为 \(x\)。
那么可能会出现 $v_{(x + k) \mod m} = v_{(x - k) \mod m} $ 的情况,因为 \(kd\) 的上界是 n-1 的,所以可能会有 \((2 \times n - 2) \mod m \equiv 0\) 的情况。
但这种情况直接取反集即可。
因为 \((m - n) \times m\)。
总结:
感觉挺需要脑洞的。
下次看到这种类型的题,可以先找一下有什么性质。
就比如 m 是质数,就能保证 \(\gcd(kd, m)\) = 1。
然后枚举其实也可以不用特别呆板。
可以枚举类似乘积的东西,然后考虑其中一个因子有什么性质。
T2
题目大意:
给定一个 \(n\),求长度为 \(n\) 的排列中有多少逆序对数为 \(n\)。
\(n \le 10^5\)。
解题思路:
先考虑暴力 dp。
\(dp_{i, j}\) 表示长度为 \(i\) 的排列,逆序对为 \(j\) 的方案数。
然后发现转移就可以抽象成:
求有多少长度为 \(n\) 的数组 \(a\),使得 \(a_{i} < i\),且 \(a\) 之和为 \(n\)。
由于要求 \(a_{i} < i\) 这种条件比较难搞,所以我们可以改成容斥原理,枚举集合 \(S\),强定 \(S\) 不满足条件。
那么设 \(dp_{i, j}\) 表示 \(a_{x} = x\) 的个数有 i 个,和为 j。
那么有两种转移:
- \(dp_{i,j} => dp_{i + 1, j + 1 + i}\)
- \(dp_{i,j} => dp_{i, j + i}\)
可以证明这是可以全部转移到的。
第一个转移的意思就是新加进一个不合法的数字,由于要求不一样,所以要将其他的+1。
第二个转移就是直接整体 +1。
所以这样是 \(O(n^{1.5})\) 的,因为 \(i\) 为 \(n^{0.5}\) 级别。
总结:
挺套路的,但感觉这种不好直接对限制做 dp 可以通过容斥将问题转化的更简单。
T3
题目大意:
给定一个 n 个点,m 个边的图。
保证了 \(u - v \le k, k \le 5\) 然后有 q 个询问,每个询给定 \(l, r\),问你只保留 \(l \sim r\) 的点时有多少联通块。
\(n,q \le 10^5\)
赛时思路:
就是考虑暴力分块,当块长足够大时,那么只有相邻两个块才会有交集。
所以时间复杂度就是 \(O(n^{1.5} \times k^2 \log n)\)。
卡不过去...
解题思路:
考虑在线不好做,那么离线考虑。
由于合并一个点的时间复杂度至少是 \(O(k \log n)\) 的,而且并查集支持删除有点困难,要回滚莫队大常数,所以莫队不可行。
考虑分块,但由于合并是 \(O(k^2 \log)\) 的,总共要 \(O(q \times \sqrt(n) \times k^2 \log n)\) 的时间复杂度,而且这题没有修改,分块几乎是没有优势的。
线段树比分块好点,但是 \(O(n \times k^2 \log^2 n)\) 的时间复杂度,大常数也过不去,不过也支持查询。
考虑类似离线线段树的猫树,预处理出 \(mid + 1 \sim r\) 的联通块个数以及 \(mid + 1 \sim mid + k\) 的并查集的状态,这样比线段树的优势就在于合并的次数少了。
而且常数不大,可以通过。
时间复杂度:\(O(q \times log_{n} \times k ^ 2)\)。
路径压缩的常数。
总结:
分块的优势在于能够比较慢地支持修改以及一些复杂地查询,不过时间复杂度较高,得先确定没有更优地算法再写。

浙公网安备 33010602011771号