cf 1349b Orac and Medians

http://codeforces.com/contest/1349/problem/B
题意:给n个数和k,每次操作可以把一段子序列换成它的中位数(偶数的中位数算中间两个数里前面的那个),求是否可以通过若干次操作把它全变成k。

这道题本质上不难,但情况考虑的不完整。首先可以发现这n个数可以分成3类:大于k,等于k,小于k。数列里没有k则显然不成立,下面只考虑数列中存在至少1个k。
在2个数中有一个等于k,一个大于k,则两个都可以变成k。而一个大于等于k,一个小于k,那么就不能都变成k。也就是与k相邻的大于k的数都可以变成k,而且大于k的数更容易变成k。
在3个数中,有两个大于等于k的数,那么这3个都会变成大于等于k。所以两个相邻的大于等于k的数可以逐步使附近的数都变成大于等于k,且遇到k时,这些数都会变成k。所以存在2个大于等于k的数相邻时,答案一定是yes。
如果不存在2个大于等于k的数相邻,那么只有一种情况答案是yes:三个相邻的数,左右两个大于等于k,中间的小于k。
这样扫一遍数组就可以判断答案了。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值