CF1350D Orac and Medians(找规律)
题意:
给出一个序列,每次操作可以选择一段子序列,使得里面的最小的比中位数大的值为t,子序列所有的值都变成这个t。(子序列长度len,中位数(len+1)/2)。
现在给出一个数k,询问能否通过操作把整个序列变成k。
题解:
找规律可以发现,我们需要序列里有一个数是k,同时需要存在两个大于等于k的数同时它们之间的距离要小于等于2。
对n是1的情况特判一下。
#include<bits/stdc++.h> using namespace std; const int maxn=1e5+100; int a[maxn]; int n,k; int main () { int t; cin>>t; while (t--) { cin>>n>>k; for (int i=1;i<=n;i++) cin>>a[i]; if (n==1) { if (a[1]==k) printf("yes\n"); else printf("no\n"); continue; } int f=0; for (int i=1;i<=n;i++) if (a[i]==k) f=1; if (!f) { printf("no\n"); continue; } f=0; int pre=0; for (int i=1;i<=n;i++) { if (pre&&a[i]>=k&&i-pre<=2) { //printf("%d %d\n",pre,i); f=1; } if (a[i]>=k) pre=i; } if (!f) printf("no\n"); else printf("yes\n"); } }