题意:
给出一个序列,每次操作可以选择一段子序列,使得里面的最小的比中位数大的值为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 "); else printf("no "); continue; } int f=0; for (int i=1;i<=n;i++) if (a[i]==k) f=1; if (!f) { printf("no "); continue; } f=0; int pre=0; for (int i=1;i<=n;i++) { if (pre&&a[i]>=k&&i-pre<=2) { //printf("%d %d ",pre,i); f=1; } if (a[i]>=k) pre=i; } if (!f) printf("no "); else printf("yes "); } }