AHOI2016 迷宫

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

放C++代码。

#include
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<


AC代码。

你可能感兴趣的:(洛谷的题目)