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