Orac and Medians CodeForces - 1349B
阿新 • • 發佈:2021-06-19
原題連結
考察:思維
思路:
從小區間開始看:
- len==2,只有區間:k >k各一個,才能成功.只要出現了2個k,那麼在len==3的區間內一定能成功.此時遞推出yes.
- 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; }