CF 775 Div2 补题

个人记录,如题

D:一个数组a ,若 a i ≤ a j a_i \leq a_j aiaj , 则一定存在 ⌊ a j / a i ⌋ ⌊a_j/a_i⌋ aj/ai ,则输出Yes,反之输出No

枚举 a i a_i ai,查询数列a中是否存在 ( a i ∗ k , a i ∗ k − 1 ) (a_i*k,a_i*k-1) (aik,aik1)中的数,再判断k是否再数组中,时间复杂度是调和级数。

#include 
#include 
using namespace std ;

#pragma GCC optimize(2)
#define ull unsigned long long
#define endl '\n'
typedef long long ll ;
const ll maxn = 1e6+100 ;
const ll p = 1e9+9 ;

bool vis[maxn] ;
int a[maxn] , n , c , sum[maxn]; 
bool cmp(){
	if(!vis[1])		return 0 ;
	for(int i=1;i<=c;++i)	sum[i] += sum[i-1] ;
	for(int i=2;i<=c;++i){
		if(!vis[i])		continue ;
		for(int j=2*i;j<=c;j+=i){
			int l = j-1 , r = min(j+i-1,c) ;
			if(sum[r]-sum[l]){
				if(!vis[j/i])		return 0 ;
			}
		}
	}
	return 1 ;
}
void solve(){
	int T ;
	scanf("%d",&T) ;
	while(T--){
		scanf("%d%d",&n,&c);
		for(int i=0;i<=c;++i)	vis[i] = 0 , sum[i] = 0 ;
		for(int i=0;i<n;++i){
			scanf("%d",&a[i]) ;
			vis[a[i]] = 1 ;
			sum[a[i]] = 1 ;
		}
		if(cmp())	printf("Yes\n") ;
		else		printf("No\n") ;
	}
}
int main(){
	//ios::sync_with_stdio(0) , cin.tie(0) , cout.tie(0) ;
	solve() ;
	return 0 ;
} 

你可能感兴趣的:(codefoeces,c++)