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;
}
posted @ 2025-09-12 19:39  FormulaOne  阅读(7)  评论(0)    收藏  举报