Run ID 作者 问题 语言 测评结果 分数 时间 内存 代码长度 提交时间
27924 masppy 【BJ】T1 C++ 运行超时 26 4009 MS 19880 KB 2554 2024-03-31 14:28:22

Tests(6/23):


#include<bits/stdc++.h> #define ll long long using namespace std; const int maxn=1e6+10; const ll inf=1e17+10; const ll mod=998244353; int n,m; struct node{ double x,y; }rab[maxn],hill[maxn]; double r[maxn],k[maxn],b[maxn],pos1[maxn],pos2[maxn],flag[maxn]; int fa[maxn]; int find_root(int x){ if(fa[x]==x) return x; return fa[x]=find_root(fa[x]); } double calc(double lx,double rx,double ly,double ry){ return (lx-rx)*(lx-rx)+(ly-ry)*(ly-ry); } int main(){ //freopen("beacons.in","r",stdin); // freopen("beacons.out","w",stdout); scanf("%d%d",&n,&m); for(int i=1;i<=n;i++){ scanf("%lf%lf",&rab[i].x,&rab[i].y); fa[i]=i; } for(int i=1;i<=m;i++){ scanf("%lf%lf%lf",&hill[i].x,&hill[i].y,&r[i]); } int num=0; for(int i=1;i<=n;i++){ for(int j=i+1;j<=n;j++){ num++; if(rab[j].x==rab[i].x) k[num]=inf; else k[num]=(rab[j].y-rab[i].y)/(rab[j].x-rab[i].x); b[num]=rab[i].y-k[num]*rab[i].x; pos1[num]=i; pos2[num]=j; } } for(int i=1;i<=m;i++){ for(int j=1;j<=num;j++){ double b1,meet,k1; //cout<<k[j]<<endl; if(k[j]==inf){ double ty=max(rab[(int)pos1[j]].y,rab[(int)pos2[j]].y); double by=min(rab[(int)pos1[j]].y,rab[(int)pos2[j]].y); double uy=hill[i].y+sqrt(r[i]-(rab[(int)pos1[j]].x-hill[i].x)*(rab[(int)pos1[j]].x-hill[i].x)); double dy=hill[i].y-sqrt(r[i]-(rab[(int)pos1[j]].x-hill[i].x)*(rab[(int)pos1[j]].x-hill[i].x)); if(rab[(int)pos1[j]].x>=hill[i].x-r[i]&&rab[(int)pos1[j]].x<=hill[i].x+r[i]&&ty>=uy&&by<=dy){ flag[j]=1; } // cout<<flag[j]<<endl; continue; } if(k[j]==0){ meet=hill[i].x; } else{ b1=hill[i].y+hill[i].x/k[j]; //cout<<hill[i].y<<" "<<hill[i].x<<endl; meet=(b1-b[j])*k[j]/(k[j]*k[j]+1); } if(meet<min(rab[(int)pos1[j]].x,rab[(int)pos2[j]].x)||meet>max(rab[(int)pos1[j]].x,rab[(int)pos2[j]].x)) continue; double alen=calc(k[j]*meet,k[j]*rab[(int)pos1[j]].x,meet,rab[(int)pos1[j]].x); double clen=calc(hill[i].x,rab[(int)pos1[j]].x,hill[i].y,rab[(int)pos1[j]].y); if(clen-alen<=r[i]*r[i]){ flag[j]=1; } // cout<<pos1[j]<<" "<<pos2[j]<<" "<<i<<" "<<meet<<" "<<alen<<" "<<clen<<" "<<endl; } } for(int i=1;i<=num;i++){ if(flag[i]) continue; //cout<<pos1[i]<<" "<<pos2[i]<<endl; int x=find_root(pos1[i]); int y=find_root(pos2[i]); fa[x]=y; } int cnt=0; for(int i=1;i<=n;i++){ if(fa[i]==i) cnt++; } printf("%d",cnt-1); fclose(stdin); fclose(stdout); return 0; }


测评信息: