CF1750 记录

下面是 VP 时过的题。

Indirect Sort

可以发现 \(1\)\(a_1\) 处,则其他位置可以自由交换;否则 \(1\) 的对应数不能变大(并且其他数不能变小),也不能换到 \(a_1\) 上。所以有一组合法操作的充要条件是 \(a_1=1\)

代码

Maximum Substring

可以发现花费为 \(cnt_0cnt_1\) 时取整个串一定最优,其余显然是处理极长相同值的段即可。(为什么 B 比 A 简单)

代码

Complementary XOR

考虑构造 \(s_1,s_2\) 对应的差分序列 \(d_1,d_2\)。此时选择区间 \([l,r]\) 进行操作后,\(d_{1,l},d_{1,r+1}\)\(d_{2,1},d_{2,l},d_{2,r+1}\) 都会取反(\(d_{1,n+1},d_{2,n+1}\) 恒为 \(0\));而目标是将 \(d_1,d_2\) 内每个数变为 \(0\)。此时 \(\exists i>1,d_{1,i}\ne d_{2,i}\) 则无解;否则结合 \(d_{1,1},d_{2,1}\) 的初值讨论即可。

代码

Count GCD

\(G_i=\gcd\limits_{j=1}^i a_i\),考虑从 \(G_i\)\(G_{i+1}\) 需要 \(a_{i+1}\) 满足什么性质。此时 \(\gcd(G_i,a_{i+1})\)\(G_{i+1}\),需要 \(G_i\bmod G_{i+1}=0\)\(\frac{G_i}{G_{i+1}}\)\(\frac{a_{i+1}}{G_{i+1}}\) 互质。此时可以对于每个 \(\frac{G_i}{G_{i+1}}\) 处理质因数(对于某个合法的情况,\(\prod_{i=1}^{n-1}\frac{G_i}{G_{i+1}}\le M\),故总时间复杂度为 \(O(\sqrt m)\)),然后对于 \(\frac{a_{i+1}}{G_{i+1}}\) 容斥出对应的答案时,由于 \(2\times 3\times 5\times 7\times 11\times 13\times 17\times 19\times 23<10^9<2\times 3\times 5\times 7\times 11\times 13\times 17\times 19\times 23\times 29\);可得单次容斥计算的时间不超过 \(O(2^9)\)

代码


下面是赛后过的题。

Bracket Cost

参考了 dottle 的题解。

考虑对某个子串 \([l,r]\) 进行操作时,设内部的左括号总数为 \(L\),右括号总数为 \(R\),匹配的括号对数为 \(X\),则对 \([l,r]\) 操作的最小代价为 \(\max(L,R)-X\)

证明:先考虑必要性。第一个操作可以视为删除某个字符并在更前面任意处插入该字符,则每次操作一定不会增加对于一对匹配的括号,操作次数一定不会小于 \(\max(L,R)-X\)

然后考虑可能性。考虑 \(L\ge R\) 的情况:可以从前往后扫每个未匹配的左括号,如果存在未匹配的右括号,则其一定在这个左括号前面,可以直接把左括号移到该右括号前;否则在后面新增一个右括号。每一次操作均减少了一个未匹配的左括号,故总操作数为 \(\max(L,R)-X\)

此时需要计算 \(\sum\max(L,R)\)\(\sum X\)。计算 \(\sum X\) 时,可以对原串的括号序列贪心进行匹配,然后对于每个括号对 \((l,r)\),有 \(l(n-r+1)\) 个子串包括它。计算 \(\max(L,R)\) 时,可以将其拆成 \(\frac 12(L+R+|L-R|)\)\(\sum L+R\) 不难求,然后求 \(\sum |L-R|\) 时可以令左括号为 \(1\),右括号为 \(-1\)\(s_i\)\(1\sim i\) 之和,则 \(\sum |L-R|\)\(\sum_{i=0}^n\sum_{j=i+1}^n |s_i-s_j|\)。可以把 \(s\) 升序排序,则 \(\sum |L-R|=\sum_{i=0}^n\sum_{j=i+1}^n (s_j-s_i)=\sum_{j=1}^n js_j-\sum_{i=0}^n(n-i)s_i\)

代码

Majority

先排除某个串的首位两端有 \(0\) 的情况,则长为 \(n\) 且两端一定有 \(1\) 的串的数量显然为 \(2^{n-2}\)\(n\ge 2\))。下面只考虑两端一定为 \(1\) 的串。

考虑在最后每一个不合法的串只能转成 \(2p+1\) 部分,满足第奇数部分全为 \(1\),第偶数部分全为 \(0\) 且长度大于两边两段 \(1\) 的长度和。可以枚举最后的串的形态然后进行 dp。

\(dp_{i,j}\)\(1\sim i\) 内最后一个全 \(1\) 段的长度为 \(j\) 的不合法的串的数量,\(f_i\) 为长度为 \(i\) 的合法串(特别地,\(dp_{i,i}=f_i\))转移时枚举最后的全 \(0\) 段和全 \(1\) 段,则式子有 \(dp_{i,j}=f_j\sum_{b=1}^{i-1}\sum_{a=1}^{b-j-1}dp_{i-j-b,a}\)。此时根据定义有 \(i-j-b+a=i-j-(b-a)<i-2j\),问题相当于求 \(\sum_{a+b<i-2j}dp_{a,b}\),前缀和优化即可。

代码

posted @ 2022-11-07 11:24  Fran-Cen  阅读(25)  评论(0编辑  收藏  举报