4031: reverse

题目描述
小G有一个长度为n的01串T,其中只有TS = 1,其余位置都是0。现在小G可以进行若干以下操作:

选择一个长度为K的连续子串(K是给定的常数),翻转这个子串。

对于每个i,i∈[1,n],小G想知道最少要进行多少操作使得Ti = 1。特别的,有m个“禁止位置”,你需要保证在操作过程中1始终不在任何一个禁止位置上。

n<=1e5

题解:
考场思路:发现翻转的本质即将1移动奇数/偶数个单位,然后想到将原来的1先向一个方向移动,再向另一个方向移动,因为一个点会更新到一段连续的区间,故用优先队列维护符合条件(在区间内)的最小值即可。很显然这是错的,因为它可以向不同方向移动。稍微优化一下,先向长度大的方向移动,后向另一个方向移动,这样可以骗到不少分。
考虑暴力,对于原始的1,像左右所有可能到达的点宽搜,第一个搜到的一定最短(考场时不知为何完全没有往这个方向想啊)。但这样会有O(N^2)条边,利用原来发现的性质——一个点更新到的一定是一个连续的区间,那么只要已被更新过的不再被访问即可,因为区间就是下标的取值范围,故用set维护即可。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值