由于任意两个圆没有交点,故不存在翻一次栅栏能穿过两个圆。那么对于每个栅栏,如果两个点一个在内一个在外,则必须翻,否则不用翻。时间复杂度 \(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;
}