这道题我们每次要选择一个长度大于等于k的区间,删除第k小元素,那么显然,对于整个数组的第1到第k-1小的元素,一定不会被删除,因为他们不会是任何一个子数组的第k小,因此只要不是这些数字,我们都可以删除,删除后,我们用双指针维护两端 ,如果相同就左右向中间移动,如果不同,如果其中一个是第k小的元素,那么我么那就删除 直到结束或者没有删除次数
代码实现如下:
cpp
#include <bits/stdc++.h>
using namespace std;
#define int long long
void solve(){
int n,k;
cin>>n>>k;
vector<int>a(n+1,0);
for(int i=1;i<=n;i++){
cin>>a[i];
}
vector<int>b=a;
sort(b.begin()+1,b.end());
int line=b[k-1];
vector<int>ans;
for(int i=1;i<=n;i++){
if(a[i]<=line)ans.push_back(a[i]);
}
int sz=ans.size();
int num=ans.size()-(k-1);
int l=0,r=sz-1;
while(l<r){
if(ans[l]==ans[r]){
l++,r--;
}else {
if(num&&ans[l]==line){
l++,num--;
}else if(num&&ans[r]==line){
r--,num--;
}else {
cout<<"No\n";
return ;
}
}
}
cout<<"YES\n";
}
signed main() {
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int t;
cin>>t;
while(t--)solve();
return 0;
}