Codeforces Round 862 (Div. 2) C.Place for a Selfie

 直接二分即可,联立发现带入delta判别式式子,只需要找到满足 大于等于b的第一个和小于等于b的最后一个就行了,然后看看delta是否合法

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e5+10;
int cnt[N];
int T;

int main()
{
	
	cin>>T;
	
	while(T--){
	    int n,m;
	    cin>>n>>m;
	    
	    for(int i=1;i<=n;i++)cin>>cnt[i];

	   
	    sort(cnt+1,cnt+1+n);
	    
	    for(int i=1;i<=m;i++){
	    	
	    	ll a,b,c;
	    	cin>>a>>b>>c;
	    	int l = 1,r = n;
	    	while(l<r){
	    	
	    		int mid = l+r>>1;
	    	
	    		if(cnt[mid]<b) l = mid+1;
	    		else r = mid;
	    		
	    	}
	    	
	    	
	    	int k = cnt[l];
	    	int res=0x3f3f3f3f;
	    	if(k>=b&&(ll)(b-k)*(b-k)<4*a*c){
	    		res = k;
	    	
	    	}
	    	
	    	l = 1,r = n;
	    	while(l<r){
	    		int mid = l+r+1>>1;
	    		if(cnt[mid]>b)r=mid-1;
	    		else l=mid;
	    	}
	    	
	    	k = cnt[r];
	    	
	    	if(k<=b&&r>=1&&(ll)(b-k)*(b-k)<4*c*a){
	    		
	    		res = k;
	    	}
	    	
	    	if(res==0x3f3f3f3f)puts("NO");
	    	else{
	    		printf("Yes\n%d\n",res);
	    	}
	    }
	    
	    puts("");
	    
	    
	}
	
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值