给定平面上若干个两两不相交的圆,以及若干个点,每次询问给出两个点,求两个点之间需要经过多少个圆。
注意到两个点之间若要经过某个圆,那么必定一个在圆内,另外一个在圆外。预处理每个点和每个圆的关系,用
b
i
t
s
e
t
[
x
]
[
y
]
bitset[x][y]
bitset[x][y]记录
x
x
x这个点在
y
y
y这个圆内。
每次询问直接求出两个
b
i
t
s
e
t
bitset
bitset异或后的1的个数即可。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int inf=0x3f3f3f3f;
const ll INF=LONG_LONG_MAX;
const int N=1e3+7;
bitset<1001> s[N];
int x[N],y[N];
int main() {
int n,m,k;
scanf("%d%d%d",&n,&m,&k);
for(int i=1;i<=n;i++) {
scanf("%d%d",&x[i],&y[i]);
s[i].reset();
}
for(int i=1;i<=m;i++) {
int r,rx,ry;
scanf("%d%d%d",&r,&rx,&ry);
for(int j=1;j<=n;j++) {
if(1LL*(x[j]-rx)*(x[j]-rx)+1LL*(y[j]-ry)*(y[j]-ry)<=1LL*r*r) { // in circle 1 not in circle 0
s[j][i]=1;
}
}
}
while(k--) {
int u,v;
scanf("%d%d",&u,&v);
printf("%d\n",(s[u]^s[v]).count());
}
return 0;
}