Loading

2023.2.6-2.8

前两天鸽掉了,今天写在一起吧。

ZROI2521 数正方体

考场上观察出了结论,设三个视图大小分别为 \(a,b,c\) 钦定满足 \(a\leq b \leq c\) ,能被摆出当且仅当 \(ab\geq c\) 。正确性可以从构造的角度理解。

这里介绍一下题解的做法,比我赛时大常数分类讨论多且巨大多细节的做法好很多。

我们考虑用总方案减去不合法的部分,不合法的包括 \(ab<c\)\(bc<a\)\(ac<b\) ,对这三种情况分别计数,显然不会存在方案被减去两次。

现在我们要求解这样一个式子:

\[\sum_{a=1}^A\sum_{b=1}^B\sum_{c=1}^C[c>ab] \]

\[=\sum_{a=1}^A\sum_{c=1}^C\min(B, \left \lfloor \frac{c-1}{a}\right \rfloor) \]

对于后面那个分式等于与 \(c=C\) 时取值相同的单独计算,其余的以 \(a\) 为循环节。令 \(n=\min(B, \left \lfloor \frac{c-1}{a}\right \rfloor)\)

\[\sum_{a=1}^A \left ( a\cdot\sum_{k=1}^{n-1} k+\sum_{c=an+1}^Cn\right) \]

\(C\) 视为常量,将后面式子的取值看作一个关于 \(n,a\) 的函数。

\[f(n,a)=a \cdot \frac{n(n-1)}{2}+n \cdot (C-an) \]

整除分块计算即可。

ZROI2522 数树上点

\(O(nD)\)\(\text{dp}\) 较为显然,合并两棵子树过程如下:

\[f_{x,i}\cdot f_{y,j}[i+j\geq D] \rightarrow f'_{x,\min(i,j)} \]

后缀和优化一下就可以做到 \(O(nD)\)

考虑到转移后第二维是两边取个 \(\min\) ,分别记 \(sz_x,sz_y\) 表示 \(x,y\) 子树内最深的点与其的距离,每次转移从小的合并到大的,就可以在 \(\min(sz_x,sz_y)\) 的代价内完成。

总时间复杂度就可以做到 \(O(n)\) 了。参考长链剖分。

树形 \(\text{dp}\) 如果某一维与子树某些信息有关,可以加以限制来优化,一般可以降一维。

ZROI2523 数区间集

先考虑对极大区间计数,区间 \([l,r]\) 为极大区间当且仅当区间内没有出现过 \(a_{l-1},a_{r+1}\) 。这个我们可以直接用树状数组二维数点来完成。

考虑对于极大区间计数,某些区间会被我们统计两次,我们要减掉。选取极大区间在这题中有一个性质:

被计算两次的区间不会相邻或者相交 :否则就不满足极大区间的性质了。

我们记 \(b_i\)\(a_i\) 在序列中另一个出现的位置,考虑如果一个区间 \([l,r]\) 被重复计算,那么满足:

\[w_{l,r}=\max_{i=l}^rb_i- \min_{i=l}^r b_i -(r-l)=0 \]

并且 \([\max_{i=1}^r b_i,\min_{i=l}^rb_i]\)\([l,r]\) 不相交或者相邻。
注意任意 \(w_{l,r}\) 都是非负的,问题转化成求区间权值为 \(0\) 的区间个数,限制一下区间的右端点范围即可。用线段树和单调栈维护。

对有重复元素的区间计数时可以考虑对极大或者极小区间计数,此题选择极大区间因为有不相交不相邻这个性质

CF1784D.Wooden Spoon

这题一开始我是考虑从下往上去转移,看了 \(\text{Alex_Wei}\) 的题解恍然大悟。

  • 从下往上计数:要维护每一层的胜者还有最后获得奖励的人。
  • 从上往下计数:只需要维护每一层胜者,到最后一层就是获得奖励的人。

显然应该要从上往下枚举更优。

为了转移方程的简洁,我们讲题目限制取反,最大的才会赢,显然对答案是不会有影响的。

设计 \(\text{dp}\) 状态:\(f_{i,j}\) 表示在第 \(i\) 层获胜者是 \(j\) 的方案数。初值 \(f_{1,2^n}=1\)

考虑转移,先给出转移方程:

\[{j-1-2^{n-i} \choose 2^{n-1}-1}f_{i,j} \rightarrow f_{i+1,k}(k >j) \]

这个转移方程的转移系数没有任何组合意义!或者说组合意义是错误的。

但是尝试将此题的转移倒过来,我们先要在前 \(p_1\) 个数中选择 \(q_1\) 个数,然后在前 \(p_2\) 个数中选择 \(q_2\) 个,不能与之前的重复 ...... 我们按照 \(p\) 限制从小到大排序,方案数如下:

\[{p_1 \choose q_1}{p_2-q_1 \choose q_2}...{ p_m-\sum_{i=1}^{m-1}q_i \choose q_m} \]

因而此题转移系数在每层选择下一次的数的时候看似一些数已经在之前被选择过了,但是不妨将其倒过来考虑,它就是对的!。

考虑清楚转移的顺序,正序和逆序要互通。

「WC2023 / CTS2023」楼梯

此题关键就是要想到如何利用好 \(q|n\) 这个条件。对于这一类周长相关的题目,可以考虑维护一半的折线。

对于此题,考虑用 \(01\) 序列维护右下折线,从右上角开始,向下为 \(1\) ,向左为 \(0\)

假设我们此时维护出了序列 \(A_1,A_2,...,A_{n+1}\) ,不难发现区间 \([l,r]\) 可以表示 \((\sum_{i=1}^lA-i),\sum_{i=r}^n(1-A_i)\) 这个位置的生成子楼梯边界格数为 \(r-l+1\)

对于每个询问,我们将序列中 \(A_1,A_{q+1},A_{2q+1},...,A_n\) 这些项提取出来,相邻两项构成的区间对应的子楼梯边界格数即为 \(q\) ,由于 \(q|n\) ,因此 \(n=pq+1\) 刚好为最后一项。

由于每个子楼梯必须满足第一项为 \(1\) ,最后一项为 \(0\) ,而 \(A_1=1,A_n=0\) ,我们考虑中间的一项 \(A_m\) ,如果 \(A_m=1\) 那么区间 \([m,n]\) 一定有解,否则区间 \([1,m]\) 一定有解,一直这样二分的递归下去即可。无解当且仅当楼梯为空。

那么维护 \(01\) 序列用线段树就行了。

CF1784C. Monsters (hard version)

考虑维护所有有价值的数,有价值当且仅当当前将其插入到序列中其位置不会超过其数字大小。

那么就是一个线段树上二分的题目了,我们并不关心每个位置具体是哪一个数字,只关心序列中比每个数小的数有多少个。

posted @ 2023-02-08 21:35  _YangZJ  阅读(88)  评论(0)    收藏  举报