1005

思维 首先那些中位数本身肯定要放进去,从\(1-n\)中选取完之后连续序列会裂成一个个段落。显然,两个段落对于其中间的那个set是可以两两配对抵消的(不一定要相邻)。这样分配完之后不一定会正好配完,那么:
1.这些段落长度中不存在大于段落长度总和一半的元素。那么可以断言,这些段落最后只会全部匹配完成或者剩余一个。不妨令这一个数为最大的那一个数字,并将其安排在第一个set中。因为定义中位数的方式为\((k+1)/2\),第一步配对完成时每个set中的元素个数都为奇数,所以末尾加上一个元素是无关紧要的。
2.这些段落长度中存在大于段落长度总和一半的元素,此时让剩余的数字都为这一段中的元素即可,若该段前面的set个数大于等于段中剩余数字个数,那么就是可行的。
#include<bits/stdc++.h>
using namespace std;
int b[100100];
int main(){
int T;cin>>T;
while (T--)
{
int n,m;
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++)
scanf("%d",&b[i]);
sort(b+1,b+m+1);
b[m+1]=n+1,b[0]=0;
int maxn=-1,mq,sum=0,mi;
for(int i=0;i<=m;i++){
sum+=b[i+1]-b[i]-1;
if(b[i+1]-b[i]>maxn){
maxn=b[i+1]-b[i]-1;
mq=b[i]+1;
mi=i;
}
}
if(sum-maxn<maxn){
maxn=maxn-(sum-maxn);
if(maxn>mi) printf("NO\n");
else printf("YES\n");
}else printf("YES\n");
}
system("pause");
return 0;
}
posted on
浙公网安备 33010602011771号