联合省选 2022
(预处理器就不说了)
D1t2 填树
-
感觉这个题目还是挺难搞的,但是仍然属于套路题
-
设 \(f(l,r)\) 表示值域为 \([l,r]\) 的方案数
-
那么就是 \(\sum f(i,i+K)-f(i+1,i+K)\)
-
对于 \(f(l,r)\) 考虑怎么求,直接树形 \(dp\) 是 \(O(n)\) ,那么整个复杂度就是 \(O(nV)\)
-
还是要考虑这个值域怎么优化掉,可以发现对于每一个点的点值其实就是它的合法范围和枚举的值域范围的交集
-
考虑将所有的值域划分成 \(O(n)\) 段左闭右开的区间,使得每一段区间的每个点的变化不是分段函数,而是常数或者一次函数
-
因为最终的答案是有关每一个点的点值乘积的一个函数,那么可以发现最多为 \(n\) 次多项式,做了前缀和后就是 \(n+1\) 次,所以我们考虑把前 \(n+1\) 个点值用树形 dp 先求出来,然后做前缀和,然后插值
-
那么复杂度就是 \(O(n^3)\)
-
再考虑第二问,设 \(g(l,r)\) 表示值域在 \([l,r]\) 的权值之和
-
还是考虑树形 \(dp\) ,考虑每个点每次出现的贡献就是范围和要求值域的交集中的数的和,假设为 \(b_u\)
-
考虑对于每个 \(b_u\) 出现的次数,也就是有多少条路径会经过它,这个搞个换根 dp 还是很好做的,复杂度仍然为 \(O(n)\)
-
然后考虑 \(g\) 函数的次数,因为最终是加起来的贡献,所以考虑一个点的次数,可以发现就是次数的 \(n\) 次加上 \(b\) 的 2 次,也就是 \(n+2\) 次 ,再做个前缀和就是 \(n+3\) 次
-
事实上两个 dp 大同小异,处理方式非常相似,干脆都维护前 \(n+3\) 个点值就行了
D2T1 卡牌
-
大概又是一道套路题? -
首先发下值域 \(\leq 2000\) ,那么 \(n\leq 1e6\) 似乎就没什么意义了
-
考虑类似于寿司晚宴的经典操作,根号分治
-
对于前 14 个质数,称为小质数,状压下来,对于剩下的质数称为大质数,然后以大质数为基本排序,保证大质数一样的在一段
-
然后对于每一段做背包,这个时候对于每一段就会有 \(dp[i][S]\) ,\(S\leq (1<<14-1)\)
-
那么每一次询问实际上就是固定某一些段不可以不选,也就是 \(d[i][0]\) 需要先减 1 ,然后发现答案的每个下标就是对于每个段或起来,序列值相乘,也就是对于每一个段做 FWT ,然后点值相乘,最后转回来,输出答案
-
考虑对于每一个段预处理出每个位置正变化后的点值,对于下标 0 的点值就是原来序列的值,所以可以直接减去
-
然后考虑对于每个位置的点值先相乘,询问的时候将不满足的段的每个点值乘上逆元,然后乘上正确的点值
-
可以发现这样做的常数是很大的,我最开始写的版本大数据跑了 3 s ,需要加上一些优化
-
第一个优化,对于 43*43 进行特判,因为我们之所以需要大质数实际上利用的就是大质数的唯一性,省去一个需要状压的数,可以省去一半的常数,加上这个优化后,大概需要跑 1.5s
-
第二个优化,取模优化,这个很重要,加上这个后就过了