CF33D
由于任意两个圆没有交点,故不存在翻一次栅栏能穿过两个圆。那么对于每个栅栏,如果两个点一个在内一个在外,则必须翻,否则不用翻。时间复杂度 \(O(mk)\),可以通过。
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<map>
#define int long long
#define N 1010
using namespace std;
struct C{
int r,x,y;
}c[N];
int n,m,q,d1,d2,a[N],b[N];
int dis(int x1,int y1,int x2,int y2){
return (x1-x2)*(x1-x2)+(y1-y2)*(y1-y2);
}
signed main(){
int u,v,ans;
cin>>n>>m>>q;
for(int i=1;i<=n;i++)
cin>>a[i]>>b[i];
for(int i=1;i<=m;i++)
cin>>c[i].r>>c[i].x>>c[i].y;
while(q--){
ans=0;
cin>>u>>v;
for(int i=1;i<=m;i++){
d1=dis(a[u],b[u],c[i].x,c[i].y);
d2=dis(a[v],b[v],c[i].x,c[i].y);
if(d1<c[i].r*c[i].r&&d2>c[i].r*c[i].r||d1>c[i].r*c[i].r&&d2<c[i].r*c[i].r)
ans++;
}
cout<<ans<<'\n';
}
return 0;
}
我们会走到一起的。

浙公网安备 33010602011771号