以下是代码,可以过样例
思路是通过前缀和维护区间中是否有数
然后开一个记录值域的数组对其作前缀和
然后通过前缀和判断区间xy~xy+x和xy~xy+x中是不是有数以满足比值为x、y
以下是代码!!!
万分感谢!!!!已经调了一整个下午了!!
#include <bits/stdc++.h>
using namespace std ;
int t , n , c ;
int a[1000005] , b[1000005] , maxai ;
bool mar = false ;
int main(){
scanf("%d" , &t );
while ( t -- ){
for( int i = 0 ; i <= c ; i ++ ){
b[i] = 0 ;
}
scanf("%d%d" , &n , &c );
maxai= 0;
for( int i = 1; i <= n ; i++){
scanf("%d" , &a[i] );
}
sort( a+1 , a+n+1 );
for( int i = 1 ; i <= n ; i ++ ){
b[a[i]] ++ ;
if( a[i] > maxai ){
maxai = a[i] ;
}
}
if( a[1] != 1 ){
printf("No\n");
continue ;
}
for( int i = 1 ; i <= maxai ; i ++ ){
b[i] = b[i] + b[i-1] ;
}
for( int i = maxai ; i <= c ; i ++ ){
b[i+1] = b[i] ;
}
for( int i = 1 ; i <= c ; i ++ ){
mar = false ;
for( int j = i ; j <= c ;j ++ ){
int d = a[i]*a[j] ;
if( b[min( d+j , c) ] - b[d-1] == 0 && b[min( d+i , c )] - b[d-1] == 0){
printf("No\n");
mar = true;
break ;
}
}
if( mar == true ){
break ;
}
}
if( mar == false ){
printf("Yes\n");
}
}
return 0 ;
}
感激不尽!好人一生平安!!!!!!!!!
感谢大佬!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!