水题记录2.3
文章目录
- CF822E Liar
- luoguP14139 「SFMOI Round II」Strange Counting Game
- CF912D Fishes
- CF1810E Monsters
- CF1374E2 Reading Books (hard version)
- CF1919D 01 Tree
- CF1380F Strange Addition
- CF351C Jeff and Brackets
CF822E Liar
link
题目:
考虑朴素 DP,f[i,j]f[i,j]f[i,j] 表示 sss 前 iii 位,切 jjj 段 能匹配 ttt 的前多少位。
转移考虑在 i−1i-1i−1 位是否断开,不断则有 f[i,j]=f[i−1,j]f[i,j]=f[i-1,j]f[i,j]=f[i−1,j]。
否则有 f[i+x,j+1]=max(f[i,j]+x)f[i+x,j+1]=\max(f[i,j]+x)f[i+x,j+1]=max(f[i,j]+x),其中 xxx 为 sss 从第 iii 开始,ttt 从第 f[i,j]f[i,j]f[i,j] 位开始所匹配的最大长度。
那么这题就做完了。
luoguP14139 「SFMOI Round II」Strange Counting Game
link
题目:
T(T≤1000)T(T\le 1000)T(T≤1000) 次询问,对于 n≤1018n\le 10^{18}n≤1018,求:
∑x=1n⌊x2n⌋+⌊nx⌋\sum_{x=1}^{n} \left\lfloor \frac{x^2}{n} \right\rfloor + \left\lfloor \sqrt{nx} \right\rfloor x=1∑n⌊nx2⌋+⌊nx⌋
答案对 109+710^9+7109+7 取模。
拆式子:
考虑:
=∑x=1n⌊nx⌋=∑i=1n∑x=1n[⌊nx⌋≥i]=∑i=1n∑x=1n[x≥⌈i2n⌉]=∑i=1n(n−⌈i2n⌉+1)\begin{aligned} &\phantom{=}\sum_{x=1}^n \left\lfloor \sqrt{nx} \right\rfloor\\ &=\sum_{i=1}^n \sum_{x=1}^n[\left\lfloor \sqrt{nx} \right\rfloor\ge i]\\ &=\sum_{i=1}^n \sum_{x=1}^n[x\ge \left \lceil \frac{i^2}{n}\right\rceil]\\ &=\sum_{i=1}^n (n-\left \lceil \frac{i^2}{n}\right\rceil+1) \end{aligned} =x=1∑n⌊nx⌋=i=1∑nx=1∑n[⌊nx⌋≥i]=i=1∑nx=1∑n[x≥⌈ni2⌉]=i=1∑n(n−⌈ni2⌉+1)
所以所求为:
n2+n−∑i=1n⌊i2n⌋−⌈i2n⌉n^2+n-\sum_{i=1}^n\left\lfloor \frac{i^2}{n} \right\rfloor-\left \lceil \frac{i^2}{n}\right\rceil n2+n−i=1∑n⌊ni2⌋−⌈ni2⌉
后面那坨东西,在 n∣i2n|i^2n∣i2 时结果一样,否则贡献为 −1-1−1。
所以等价于求 ∑i=1n[n∣i2]\sum_{i=1}^n[n|i^2]∑i=1n[n∣i2] 的数量。
考虑 n=∏i=1kpiain=\prod_{i=1}^kp_i^{a_i}n=∏i=1kpiai,则 n∣m2n|m^2n∣m2 一定满足 m=C⋅∏i=1kpi⌈ai2⌉m=C \cdot\prod_{i=1}^kp_i^{\left \lceil \frac{a_i}{2}\right\rceil}m=C⋅∏i=1kpi⌈2ai⌉
其中 CCC 为常数。
那么所求即为:
∏i=1kpiai∏i=1kpi⌈ai2⌉\frac{\prod_{i=1}^kp_i^{a_i}}{\prod_{i=1}^kp_i^{\left \lceil \frac{a_i}{2}\right\rceil}} ∏i=1kpi⌈2ai⌉∏i=1kpiai
等价地考虑 n=ab2(an=ab^2(an=ab2(a 不能写成 d2d^2d2 的形式 ))),那么所求即为 bbb。
那么最终答案即为 n2+n+b−n=n2+bn^2+n+b-n=n^2+bn2+n+b−n=n2+b
问题是,bbb 怎么求?
考虑枚举所有在 [1,106][1,10^6][1,106] 之间的质数,对 nnn 试除。
考虑剩下的 nnn:
- 为 111,无贡献。
- 为某个大质数,无贡献。
- 为某两个不相等的大质数相乘,无贡献。
- 为某个大质数的平方,贡献为乘上那个大质数。
这点判断是容易的。
代码:
CF912D Fishes
link
考虑求贡献前 kkk 大的点。
这点是容易的,考虑 aia_iai 表示每一列会被捕的次数,bib_ibi 为行。
有 ai=min(i,m−r+1)−max(i−r+1,1)a_i=\min(i,m-r+1)-\max(i-r+1,1)ai=min(i,m−r+1)−max(i−r+1,1),bib_ibi 同理。
那么 (i,j)(i,j)(i,j) 被捕的次数即为 ai⋅bia_i\cdot b_iai⋅bi。
对 aia_iai 排序后优先队列维护前 kkk 大即可。
代码:
CF1810E Monsters
link
考虑暴力,每次从一个 000 开始扩展。
优化:
当一个 000 能遍历到另一个 000,则以那个 000 为起点一定不优。
且有结论,每个点被遍历次数为 O(logn)O(\log n)O(logn) 级别的。所以这样子就过了。
总时间复杂度为 O(nlog2n)O(n\log^2n)O(nlog2n)
CF1374E2 Reading Books (hard version)
link
双倍经验
考虑先解决 kkk 的限制。
将书分类:
- 000000 两人都不喜欢
- 010101 Bob喜欢
- 101010 Alice喜欢
- 111111 两人都喜欢。
显然,维护 kkk 本可以在 111111 和 010101加上 101010 的优先队列维护前 kkk 小。
但是这样子可能取出来的数量 ccc 并不等于 mmm。
考虑调整。
c>mc>mc>m
那么只能将 010101 和 101010 各一本替换成为 111,注意,是用时最长换用时最短。
c<mc<mc<m
两种情况:
- 111111 换 101010 和 010101
- 随便加入一本
看哪个代价小即可。
CF1919D 01 Tree
link
考虑每次可以将 x,x−1x,x-1x,x−1 或者 x−1,xx-1,xx−1,x 变成 x−1x-1x−1,用优先队列模拟,贪心地每次变最大的即可。
或者考虑观察性质:合法的充要条件是只有一个 000,且每个非零元素左右两边第一个比其小的元素中至少有一个是其减去一。
CF1380F Strange Addition
link
DP,f[i]f[i]f[i] 表示考虑前 iii 位时的答案。
有转移:f[i]=(ai+1)f[i−1]+[ai−1=1](9−ai)f[i−2]f[i]=(a_i+1)f[i-1]+[a_{i-1}=1](9-a_i)f[i-2]f[i]=(ai+1)f[i−1]+[ai−1=1](9−ai)f[i−2]
写成矩阵形式:
[f[i]f[i−1]]=[ai+1[ai−1=1](9−ai)10]×[f[i−1]f[i−2]]\begin{bmatrix} f[i] \\ f[i-1] \end{bmatrix} =\begin{bmatrix} a_i+1 & [a_{i-1}=1](9-a_i)\\ 1 & 0 \end{bmatrix} \times \begin{bmatrix} f[i-1]\\ f[i-2] \end{bmatrix} [f[i]f[i−1]]=[ai+11[ai−1=1](9−ai)0]×[f[i−1]f[i−2]]
那么线段树维护总矩阵积,单点修改即可。
CF351C Jeff and Brackets
link
DP,f[i,j]f[i,j]f[i,j] 表示前 iii 位 jjj 个左括号未匹配时的最小代价。
则有转移:
fi,j=fi,j+1+bi,j=0fi,j=min(fi,j−1+ai,fi,j+1+bi),j>0\begin{gathered} f_{i, j}=f_{i, j+1}+b_i, j=0 \\ f_{i, j}=\min \left(f_{i, j-1}+a_i, f_{i, j+1}+b_i\right), j>0 \end{gathered} fi,j=fi,j+1+bi,j=0fi,j=min(fi,j−1+ai,fi,j+1+bi),j>0
由于 a,ba, ba,b 的循环周期是 nnn ,故最多有效的未匹配的左括号是 nnn 个,多的话可以调整后面的顺序,使得其不比 nnn 大,显然不影响,所以只考虑 fi,0,fi,1,⋯,fi,min(i,n)f_{i, 0}, f_{i, 1}, \cdots, f_{i, \min (i, n)}fi,0,fi,1,⋯,fi,min(i,n) 即可。
那么写成矩阵形式:
[fi,0fi,1⋮fi,n]=[+∞bi+∞⋯+∞ai+∞bi⋯+∞+∞ai+∞⋯+∞⋮⋮⋱⋮⋱+∞⋯ai+∞bi+∞⋯+∞ai+∞][fi−1,0fi−1,1⋮fi−1,n]\left[\begin{array}{c} f_{i, 0} \\ f_{i, 1} \\ \vdots \\ f_{i, n} \end{array}\right]=\left[\begin{array}{ccccc} +\infty & b_i & +\infty & \cdots & +\infty \\ a_i & +\infty & b_i & \cdots & +\infty \\ +\infty & a_i & +\infty & \cdots & +\infty \\ \vdots & \vdots & \ddots & \vdots & \ddots \\ +\infty & \cdots & a_i & +\infty & b_i \\ +\infty & \cdots & +\infty & a_i & +\infty \end{array}\right]\left[\begin{array}{c} f_{i-1,0} \\ f_{i-1,1} \\ \vdots \\ f_{i-1, n} \end{array}\right] fi,0fi,1⋮fi,n=+∞ai+∞⋮+∞+∞bi+∞ai⋮⋯⋯+∞bi+∞⋱ai+∞⋯⋯⋯⋮+∞ai+∞+∞+∞⋱bi+∞fi−1,0fi−1,1⋮fi−1,n
矩阵快速幂优化即可。