蒟蒻WAon#3玄关求调!!
查看原帖
蒟蒻WAon#3玄关求调!!
950927
_luo_gu楼主2024/7/19 16:59

以下是代码,可以过样例

思路是通过前缀和维护区间中是否有数

然后开一个记录值域的数组对其作前缀和

然后通过前缀和判断区间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 ;
}

感激不尽!好人一生平安!!!!!!!!!

感谢大佬!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

2024/7/19 16:59
加载中...