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。
这样扫一遍数组就可以判断答案了。

你可能感兴趣的:(codeforces)