Atcoder abc229
https://atcoder.jp/contests/abc229/tasks
G - Longest Y
一个包含字符’Y’和’.’的长n字符串S,
可以操作[0,k] 次,交换S中的两个相邻字符
问可以得到的最终S的内部最长的连续Y的长度
范围
n 2e5
k 1e12
2s
1024mb
我的思路
考虑移动
最终假设是[l..r]
那么对于初始这些y的位置的大范围是[l0..r0]
那么一定可以分成两部分
[l0..m0][m0+1..r0]
一部分向右,一部分向左
显然有个点不需要动
如果选定了第i个点p[i]和期望个数c那么,移动代价为min( 左侧k0, 右侧k1个), k0+k1+1=c
= min(sum(p[i]-k0..p[i]-1) - sum(p[i-k0]..p[i-1]) + sum(p[i+1]..p[i+k1]) - sum(p[i]+1..p[i]+k1))
换个角度
所有值变成p[i]-cnt1[i]
那么就是找一个值, 尽量多的数变成它, 且代价和 <= K
显然每多一个,代价的增量是非严格递增的
是个凸函数(下凹)
但感觉, 这样看起来, 其实左侧右侧影响不大,而是距离影响更大,
所以直接枚举中点,二分距离(选定的点的最大距离) => 去计算距离和范围,以及点数范围
这里 < 距离的必选, >距离必定不选, =距离可选可不选
似乎就没了?