C题流氓写法(

可以发现,只需要在排序后的数组中,找到长度为 的区间内,

个数形成等比数列 or 再加 个数后 个数形成等比数列

即可。注意到如果满足以上条件,这个区间的两端端点的值之差分别为:

or

所以只需要遍历从 (下标从1开始)到 ,每次判断该点和该点对应的长度 的区间的左端点的值之差即可。

for(int iii=0;iii<t;iii++)
    {
        suc=0;//记录是否已经找到过符合条件的区间端点
  
        cin>>n>>m;//输入
        for(int i=1;i<=n;i++)
            cin>>a[i];
        
        if(m>n+1){cout<<"NO"<<endl;continue;}//特判,n再加上1个棋子也不够m个
        
        if(m==2&&n>=1){cout<<"YES"<<endl;continue;}//特判,m为2时只要有棋子一定成立。
        
        sort(a+1,a+n+1);//排序
        
        for(int i=m-1;i<=n;i++)
        {
            if(a[i]-a[i-(m-1)+1]==m-2||a[i]-a[i-m+2]==m-1)
            {cout<<"YES"<<endl;
             suc=1;break;}
        }
        if(!suc)cout<<"NO"<<endl;
    }