CF1750 记录

下面是 VP 时过的题。

Indirect Sort

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

代码

Maximum Substring

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

代码

Complementary XOR

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

代码

Count GCD

Gi=gcdj=1iai,考虑从 GiGi+1 需要 ai+1 满足什么性质。此时 gcd(Gi,ai+1)Gi+1,需要 GimodGi+1=0GiGi+1ai+1Gi+1 互质。此时可以对于每个 GiGi+1 处理质因数(对于某个合法的情况,i=1n1GiGi+1M,故总时间复杂度为 O(m)),然后对于 ai+1Gi+1 容斥出对应的答案时,由于 2×3×5×7×11×13×17×19×23<109<2×3×5×7×11×13×17×19×23×29;可得单次容斥计算的时间不超过 O(29)

代码


下面是赛后过的题。

Bracket Cost

参考了 dottle 的题解。

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

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

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

此时需要计算 max(L,R)X。计算 X 时,可以对原串的括号序列贪心进行匹配,然后对于每个括号对 (l,r),有 l(nr+1) 个子串包括它。计算 max(L,R) 时,可以将其拆成 12(L+R+|LR|)L+R 不难求,然后求 |LR| 时可以令左括号为 1,右括号为 1si1i 之和,则 |LR|i=0nj=i+1n|sisj|。可以把 s 升序排序,则 |LR|=i=0nj=i+1n(sjsi)=j=1njsji=0n(ni)si

代码

Majority

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

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

dpi,j1i 内最后一个全 1 段的长度为 j 的不合法的串的数量,fi 为长度为 i 的合法串(特别地,dpi,i=fi)转移时枚举最后的全 0 段和全 1 段,则式子有 dpi,j=fjb=1i1a=1bj1dpijb,a。此时根据定义有 ijb+a=ij(ba)<i2j,问题相当于求 a+b<i2jdpa,b,前缀和优化即可。

代码

posted @   Fran-Cen  阅读(29)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 【杂谈】分布式事务——高大上的无用知识?
点击右上角即可分享
微信分享提示