省选联考2022 VP挂分记
-
这段文字来自于原 省选复习,由于整理的需要,被单独拿出来了。
-
这段文字写于 2024 年,那时候作者水平不高,各位大佬见到不要嘲讽 qaq
Day1
概况
\(100+21+20=141\),感觉什么都不会。
T1 模拟,但是一开始没看懂递归展开的定义研究了好久,也不知道怎么做,还和多次展开搞混了好几次。
后来想了一个非常暴力的做法,直接暴力维护每个位置被哪些宏展开过,不能重复展开,这个可以用 bitset。然后每次暴力一遍一遍扫去匹配看看有没有能展开的,碰到就暴力展开并维护展开的宏,如果有一次没找到能展开的就结束寻找并输出。
很暴力,感觉复杂度不对但是绝对跑不满。
然后就写了将近 2h,废。
看 T2,数数题,对于与值域无关的算法完全想不到,\(O(nK)\) 的也想不到,只会 \(O(n^2K)\),这样可以拿 20。
其实有好几个 \(O(n^2K)\) 的想法,感觉比较好写的是枚举最大值的位置再枚举最大值,以这个位置为根 dfs 整棵树计算每个位置有多少种取值,然后想办法计算方案数和权值和。
可能会出现多个最大值,这个时候钦定编号最小的为最大值,即算取值方案数的时候编号大于它的可以取到 \(mx\),小于它的不行。
然后方案数对了,但是权值和调了好久都过不了样例二,交上去的时候就估分 14。结果模拟过后上洛谷测发现 21,多过了后面一个 \(n\leq 200,K\leq 200000\) 的点的第一问,大概因为跑不满吧。
后来发现如果要对每个子树的权值和分别算贡献,应该乘上其它子树权值方案数的和而不是大小的和。如果场上调出来就有 30 了,悲。
T3 题目一看就不想看,看完了也不想写,但是发现数据范围的表很大,就看了一下,诶这题怎么送了 20 分啊,送的分还不拿那不是傻。加上第一个点的暴力还有 24 呢,比 T2 分还高。
可惜多测,第一个点的爆搜忘记每次把最大值初始化为 \(0\) 了,所以 -4,悲。
后来发现自己的 T1 代码是全机房最长。果然不会写模拟,废。
补题
见上文。
可能从一开始思路就稍微有点偏差,所以优化不下去了。我想的是先枚举点,再枚举最大值,再统计答案,这样 \(O(n^2K)\) 似乎是什么样都无法优化掉的。而如果先枚举最大值/最小值,然后再树形 dp 就有优化到 \(O(nK)\) 的可能。
假设此时钦定最小值为 \(mn\),所以我们需要找到权值在 \([mn,mn+K]\) 中的方案。这样的计算有一些问题:可能算出的答案包含一些最小值 \(> mn\) 的方案,处理也很简单,只要再做一遍 dp,减去权值在 \([mn+1,mn+K]\) 范围内的方案就行了。这个做法用换根 dp 或者是写的好一点的计数 dp 似乎可以拿到 40 分。
但是以上的做法时间复杂度与 \(K\) 有关,这显然是不行的。
记录每个点在规定权值范围后可以取值的区间为 \([l_i,r_i]\)(与原题中的 \(l,r\) 不同),发现权值区间 \([mn,mn+K]\) 移动时,第一问每个点的答案 \(a_i= r_i-l_i+1\),第二问每个点的答案 \(b_i=\frac{(l_i+r_i)(r_i-l_i+1)}{2}\) 都不会有太大的变化。其实,在一定的范围内,\(mn\) 变化时,\(a_i\) 可以看成关于 \(mn\) 的一次函数,\(b_i\) 可以看成关于 \(mn\) 的二次函数(可以想象一下一个固定的区间和一个移动的区间的交的变化情况),观察 dp 式子发现第一问答案可以看成一个关于 \(mn\) 的 \(n+1\) 次多项式,第二问可以看成一个 \(n+2\) 次多项式,第一问第二问答案的前缀和也可以看成 \(n+1\) 次多项式和 \(n+2\) 次多项式。
所以我们可以用 dp 求出前缀和的多项式,然后这题就做完了。 似乎是可以的但我不会。其实我们只是要计算这个多项式的一个点值,而我们可以 dp 求出若干个点值,所以想到插值。
然后就真的做完了。对于每个点我们算出所有的断点,这些断点把整个值域分成了若干段,段数 \(O(n)\) 级别。对于每一段内,第一问第二问答案的前缀和都是一个确定的多项式,我们需要 dp 求出至多 \(n+1\) 个点值,然后拉格朗日插值就行了。(这里的 dp 似乎是可以 \(O(n^2)\) 的?如果常数优秀是不是 \(200\) 能过 \(O(n^4)\) 啊)
Day2
概况
\(25+0+12=37\),这是真的什么都不会啊!
一开始的想法是把每个数分解,然后根据是否含质数因子表示成一个二进制数,最后的答案可以 \(\operatorname{OR}\) 卷积算,结合前面的无脑暴力能拿 40。
众所周知 30 以内有 10 个质数,所以二进制的位数枚举到 10,而我程序里面根据平时的习惯写了枚举到 \(n\),谁知道第二个《大》样例的 \(n\) 正好等于 10 呢?于是我过了第二个样例之后就没管它,愉快的 -15,沦为暴力分。
T2 一眼没思路,不会,就放弃了。
T3 一眼只会暴力,然后也就只会暴力了。
后面的时间一直在想 T1 的那种做法能不能优化,时间都耗完了也没想到换一种方式,想到容斥了但是并没有想下去。悲。
所以我是废物。
看了 22 年,JS 女生进队的最低是 173 分。
总结一下两天一共挂分 \(4+15=19\) 分,废。
补题
说实话不太想订正。
看了题解之后才发现有很多状态完全没有用,应为每个数不可能同时有两个或以上 \(> \sqrt{2000}\) 的质因数。
考虑根号分治,对于大质数和小质数分开算。把数分为不含大质数的和含哪一个大质数的几类,然后 \(OR\) 卷积卷起来就行了。
也可以用容斥做,强制一些数不满足,对于含大质数的分开算。
T2 T3 是真的不想没时间订正了。

浙公网安备 33010602011771号