9.24
P11770 檐牙覆雪
暴力很好写,直接枚举即可。单次询问复杂度 \(O(nlogn)\)。打个表,发现每个地方的最大雪堆都是由它的最大质因子位置转移而来.
设 \(f_i\) 表示最后 \(i\) 处最大雪团体积,则有转移:\(f_i=max(f_{\frac{i}{p}})+\frac{n}{\frac{i}{p}}-p+1\)。
于是我们可以预处理出每个数的最大质因子。发现它们会构成一棵树。我们每次往根节点走,在到达的点加上贡献即可。
复杂度 \(O(T+nlogn)\)。
9.25
P6097 子集卷积
首先有 \(h_i=\sum_{j \cup k=i}f_j \times g_k\)。
第一个限制 \(i \cup j=k\),直接上 \(FMT\) 即可。
第二个限制 \(i \cap j=k\),可以转换为 \(\left | i \right |+\left | j \right |=\left | i \cup j \right |\),计算时再开一维记录集合大小即可。
令 \(f_{i,j}=a_j \times [\left | j \right |=i]\),\(g_{i,j}=b_j \times [\left | j \right |=i]\),则有 \(h_i=\sum_{k=0}^if_k*g_{i-k}\)。最后答案即为 \(c_i=h_{\left | i \right |,i}\)。
P4463 calc
很容易写出一个暴力 \(dp\):设 \(f_{i,j}\) 表示前 \(i\) 个数取值域范围为 \([1,j]\) 的数的方案数,则有转移:\(f_{i,j}=f_{i-1,j-1}\times j+f_{i,j-1}\),最终答案即为 \(f_{n,V}\times n!\)。
但此时是 \(O(nV)\) 的,考虑优化。
对 \(f\) 进行差分,令 \(g_{i,j}=f_{i,j}-f_{i,j-1}\),则有转移:\(g_{i,j}=j \sum_{k=0}^{j-1}g_{i-1,k}\),同时也有 \(f_{i,j}=\sum_{k=0}^jg_{i,j}\)。
此时可以发现 \(g_{n,i}\) 是关于 \(i\) 的二次函数,证明略。
接下来就很好做了:先 \(dp\) 出值域为 \([1,2n-1]\) 的 \(f\) 值,然后拉插求出这个 \(2n+1\) 次函数,最后带入 \(x=V\) 即可。
9.26
P10102 矩阵
直接判的话是 \(O(n^3)\) 的,考虑优化。
发现对于一个向量 \(D\),\(D \times A \times B=D \times C\),而向量和矩阵相乘是 \(O(n^2)\) 的,所以我们可以随机构造一个向量,判断是否满足条件即可。
正确性我不会证,不过听 sgz 说错误率为 \(\frac{1}{mod}\)。
P12479 长野原龙势流星群
为什么大家都写 \(dp\) 呀,只有我觉得这是贪心吗?
考虑一个最大点权的点 \(x\),那么以它为根的联通块一定只选它一个,这很显然。
我们再考虑它的父亲 \(y\),不难发现,如果一个联通块包含了 \(y\),那么再包含一个点 \(x\) 一定不劣。那么我们就可以直接把 \(x\) 和 \(y\) 缩成一个点。用优先队列维护这个过程,将点权变为平均点权即可 \(O(nlogn)\) 解决。
P13523 序列与查询
赛时写的 KTT,成功被眉目出题人卡成 \(70\)。
设 \(f(x)\) 表示长度为 \(x\) 的最大子段和大小,那么此时区间加 \(k\) 对 \(f\) 的影响就是 \(f(x)=f(x)+kx\)。
发现所有 \((x,f(x))\) 构成一个上凸壳,因此我们只需要预处理出上凸壳,查询时在凸壳上二分,即可 \(O(logn)\) 完成一次查询。具体的,我们对于一条斜率为 \(-k\) 的直线,我们在凸壳上二分,找到与凸壳相切的直线即可。
考虑如何预处理凸壳。我们采用分治的方法,将区间 \([l,r]\) 分成 \([l,mid]\) 和 \([mid+1,r]\) 递归下去,处理出区间内的凸壳,然后将左右区间的凸壳合并即可。对于合并,直接闵可夫斯基和就可以。
复杂度 \(O(nlogn+qlogn)\)。
KTT 过几天再写。