1. 程式人生 > 其它 >Orac and Medians CodeForces - 1349B

Orac and Medians CodeForces - 1349B

原題連結
考察:思維
思路:
  從小區間開始看:

  1. len==2,只有區間:k >k各一個,才能成功.只要出現了2個k,那麼在len==3的區間內一定能成功.此時遞推出yes.
  2. len==3,不考慮(k,>k)的區間長度=2的情況,假設區間記憶體在k,那麼此時只有(<k,k,k)或者(k,<k,>k),(>k,<k,k) 才能成功轉化.假設不存在k,我們可以發現(<k,>k,>k)的情況且陣列存在k可以推到len==2的情況.

  總結即判定長度為2的區間,和判定長度為3的區間即可.

Code

#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 100010;
int n,k,a[N];
bool check()
{
	bool ok = 0;
	for(int i=1;i<=n;i++)
	  if(a[i]==k) ok = 1;
	if(!ok||n==1) return ok;
	for(int i=2;i<=n;i++)//  ==k >k
	  if(a[i-1]>k&&a[i]==k) return 1;
	  else if(a[i-1]==k&&a[i]>k) return 1;
	int cnt[2];
	memset(cnt,0,sizeof cnt);
	for(int i=1,j=1;i<=n;i++)//<k >k >k
	{
		while(j<=n&&j-i<=2)
		{
			if(a[j]<k) cnt[0]++;
			else cnt[1]++;
			j++;
		}
		if(cnt[1]>cnt[0]) return 1;
		if(j>n) break;
		if(a[i]<k) cnt[0]--;
		else cnt[1]--;
	}
	return 0;
}
int main()
{
	int T;
	scanf("%d",&T);
	while(T--)
	{
		scanf("%d%d",&n,&k);
		for(int i=1;i<=n;i++) scanf("%d",&a[i]);
		if(check()) puts("yes");
		else puts("no");
	}
	return 0;
}