AHOI2016 迷宫

今年在考场上做这道题的时候还是初三,现在就变成高一了。。突然又看见这道题就突然想来AC一下。。
表示这道骚题在考场上做的时候各种懵逼的并查集(脑子不好使)。
虽然到现在我还坚信并查集一定能做出来。。
好言归正传,此题的思路就是判断每一个圆是不是包含两个点。如果都包含,或者都不包含,则答案不变;
如果只有一个点包含在里面,就只好ans++了。。
当年是爆0了这题(其实也就今年)。现在做毫无压力,最慢一个点也才一秒钟多一点点。。
【以上感伤不要理我】

放C++代码。

#include<iostream>
using namespace std;

int n,q,a,b,c,d,ans;
struct node
{
	int x,y,r;
}circle[8001];

bool judge(int px,int py,int num)//感觉怪怪的
{
	if((px-circle[num].x)*(px-circle[num].x)+(py-circle[num].y)*(py-circle[num].y)<=circle[num].r)
		return true;//在这个圆里
	return false; 
} 

void read()
{
	int i,j;
	
	std::ios::sync_with_stdio(false);
	
	cin>>n;
	for(i=1; i<=n; i++)
	{ 
		cin>>circle[i].x>>circle[i].y>>circle[i].r;
		circle[i].r*=circle[i].r;//在这里就把平方算好,不然以后有可能要算8000次平方
	}
	cin>>q;
	
	for(i=1; i<=q; i++)
	{
		cin>>a>>b>>c>>d;
		
		ans=0;
		for(j=1; j<=n; j++)
			if(judge(a,b,j)!=judge(c,d,j))//不同时在或不在这同一个园内
				ans++; 
		
		cout<<ans<<endl;
	}
	
	return;
}

int main()
{
	read();
	return 0;
}


AC代码。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值