CF1678题解

CF1678A

小清新签到题,有0其余全与0合并,有相等的数先变为0再与0合并,没有相等的数先花1的代价合并为相等的数

CF1678B

因为最后对于一个合法的串,要求连续段长度为偶数,所以,我们只关心一个偶数位二元组 \((1,2),(3,4) \dots\) 两个对应的数是否相等

若不相等,我们只能把这个数对全改为0/1,但是我们并不知道怎么改更优

若相等,这个对就是不能改变的,因为把两个数都改变一定不优

所以对于第一问的答案,我们观察有多少个不相等的对即可

对于第二问的答案,我们会把中间不相等的段都改成其左或其右一段相等的段的数值,所以对于两个相邻的相等的二元组,若相同则对答案没有贡献,若相等则有1的贡献

特殊的,对于第一个相等的二元组也对答案有1的贡献,若所有二元组都不相等则整个串必须变为一个相等的0/1,所以答案为1

CF1678C

预处理题

我们考虑若只枚举b,c那么答案既是在 \((1,b-1)\) 之中比 \(p[c]\) 小的数乘上\((c+1,n)\)之中比 \(p[b]\) 小的数,我们先预处理出比 \(p[i]\)小的数的前缀和和后缀和,就可以 \(O(n^2)\) 求解了

CF1678D

挺好玩的一道题

首先行和列分开考虑,不用算什么容斥(我没有想出来)

考虑一列,来一个人并不会影响之前的人在列上的相对位置关系,只要这个列上以前没有1,现在有了,对于这一列的影响就会一直保存下去

考虑一行,虽然来一个人会影响一行的人数,但考虑如果进入m个学生之后,它的行的答案只与第一行有关

所以我们存一下对于每一行当余数为(0,m-1)时所对应的行数再加上第一行有没有数即可,如何判断第一行有没有,存一下上一次出现1的时间,若时间小于m则第一行存在1,在更新一下对应的答案值即可

最后答案为行列答案加和

CF1678E

我们把一种颜色看成一个点,然后把同一个位置的两个点连上一条边,我们要做的就是给每个点赋值然后让所有边两边的点的差的绝对值之和最大

我们考虑连完边后会有若干个环,环与环之间相互独立,我们考虑对于一个环上的点,若两边的点都小于它,则有2a的贡献,因为都是它减别的点,若两边的点都大于它,则有-2a的贡献,若一边大一边小则有0的贡献,对一个长度为n的环我们最多有 \(n/2\) 个正贡献,\(n/2\) 个负贡献,所以,我们就将所有环的n/2加和,记为c,则将$ (n,n-c+1)$ 分配给正贡献更优,$ (1,c)$给负贡献更优,剩下的给0

推导一下式子答案为 \(2*c(n-c)\)

posted @ 2024-11-20 11:11  daydreamer_zcxnb  阅读(29)  评论(0编辑  收藏  举报