suba round solution
End Sky II
来源: codechef ANDOFMAXES
假设1: 感觉这题会全场切
\(10\%\)
爆搜
\(30\%\)
考虑 dp
设 \(f_{i,j,k}\) 表示前 \(i\) 个数 , 分成 \(j\) 段 , 能否拼成 \(k\) , 直接转移 , 复杂度 \(O(n^3a)\)
发现如果直接合并相邻的两段 , 那么答案是不降的 . 所以只需记录最多能分成几段即可 . 复杂度 \(O(n^2a)\)
\(100\%\)
考虑是否能够检查答案是否可以是某个数的母集 , 如果能够做到那么就可以按位确定答案 .
假设现在要判定的数是 \(S\).
那么标记所有为 \(S\) 母集的数 , 现在要判定是否存在划分方式将原序列分成 \(k\) 段 , 其中每段的最大值都是被标记的数 .
同样发现划分段数越多越好 , 所以设 \(f_i\) 表示前 \(i\) 个数最多能划分几段 .
预处理出每个数左边和右边第一个比它大的数的位置 , 分别记为 \(L_i,R_i\).
在被标记的数处更新 dp 数组 .
这个数可以控制的区域是 \([L_i+1,R_i-1]\)
那么转移就是将 \(\max\limits_{L_i\leq j\leq i}f_j+1\) 转移到 \(f_i-f_{R_i-1}\)
容易使用线段树实现 , 那么最后判断 \(f_n\geq k\) 即可.
时间复杂度 \(O(n\log n\log a)\)
ps: 官方有 \(O(n)\) 的 \(check\) 方法 , 可以去看 .
Hill of Sunflowers
来源: arc104e
关于 ICEY 帮我找到了 knockin' on heaven's door 这件事
\(n\leq 3\)
可能可以手玩出公式
\(n\leq 6\)
观察到 \(n\) 只有 \(6\), 考虑枚举最后 \(b_i\) 之间的大小关系 .
枚举方式是先枚举最后有几个不相等的数 , 然后指定每个 \(b_i\) 的排名 .
最多只有 \(4683\) 种 .
枚举大小关系后可以直接求出最长上升子序列长度 .
然后要算的就是满足这样的排名的 \(b_i\) 的情况数 .
问题可以转化为:
给定 \(lim_{1-n}\)
求满足 \(1\leq b_i\leq lim_i\) 的上升序列 \(b\) 的个数 .
把 \(lim_i\leftarrow lim_i-i+1\)
求满足 \(1\leq b_i\leq lim_i\) 的不降序列 \(b\) 的个数 .
设 \(f_{i,j}\) 为考虑的前 \(i\) 个数 , 最后一个数权值为 \(j\) 的情况数 .
添加 \(lim_{n+1}=\infty\) , 答案为 \(f_{n+1,\infty}\)
\(f\) 的转移式为
\(f_{i,j}=\begin{cases}\sum\limits_{k\leq j}f_{i-1,k},&1\leq j\leq lim_i\\0,&(other)\end{cases}\)
把 \(f_{i}\) 看做一个函数 .
则每次的转移可以看做
- 修改 \(f_{i}\) 的有效长度 .
- 把 \(f_{i}\) 变为 \(f_{i}\) 的前缀和 .
观察到 \(f_{i}\) 为最多有 \(i\) 段的分段函数 , 每一段内都可写成不超过 \(i-1\) 次的多项式 .
那么分别对每一段做前缀和 , 然后加上之前的段的贡献即可 .
设之前的段的贡献为 \(bas\) , 该段左端点为 \(l\) .
那么就是给定 \(f(x)=\sum\limits_{i=0}^ma_ix^i\)
计算
\(\begin{aligned}g(x)&=bas+\sum\limits_{i=l}^xf(i)\\&=bas+\sum\limits_{i=l}^x\sum\limits_{j=0}^mi^ja_j\\&=\sum\limits_{i=0}^x\sum\limits_{j=0}^mi^ja_j+bas-\sum\limits_{i=1}^{l-1}\sum\limits_{j=0}^mi^ja_j\end{aligned}\)
记 \(S_i(x)=\sum\limits_{j=1}^xj^i\)
\(\begin{aligned}g(x)&=\sum\limits_{j=0}^ma_jS_j(x)+bas-\sum\limits_{j=0}^ma_jS_j(l-1)\end{aligned}\)
\(S_i(x)\) 可以由公式
\(\displaystyle S_k(x)=\frac{(x+1)^{\underline {k+1}}}{k+1}-\sum\limits_{i=0}^{k-1}\begin{bmatrix}k\\i\end{bmatrix}S_i(x)\)
递推得出 .
证明见 大佬博客
注意这里 \(\begin{bmatrix}k\\i\end{bmatrix}\) 为有符号第一类斯特林数 .
递推公式为 \(\begin{bmatrix}n\\m\end{bmatrix}=\begin{bmatrix}n-1\\m-1\end{bmatrix}-(n-1)\begin{bmatrix}n-1\\m\end{bmatrix}\)
那么这样就可以直接求出 \(f_{n+1}\)
那么最后一段的常数项就是答案 .
ps: 这题好像也有更简单的解法
Wonderful Everyday
来源: CF1598G
幸福地生活吧!
\(20\%\)
暴力 , 使用 Hash 判断相等
\(100\%\)
设分成的第一段为 \(a\), 第二段为 \(b\).
若 \(|a|=|t|-1\), 则 \(|b|=|t|-1\)
若 \(|a|=|t|\), 则 \(|b|\) 为 \(|t|-lcp(a,t)\) 或 \(|t|-lcp(a,t)-1\)
\(lcp(a,t)\) 可以使用 \(Z-function\) 求出.
那么可行的情况被减到了 \(O(n)\) 种 , 直接 Hash 判断即可 . 这题 CF 上卡了若干常见模数 , 不过我没卡 也懒得卡.

浙公网安备 33010602011771号