1005

image

思维 首先那些中位数本身肯定要放进去,从\(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 2021-08-09 22:05  Stuart_Assassins  阅读(23)  评论(0)    收藏  举报