悬 3 关,WA 30 求调
查看原帖
悬 3 关,WA 30 求调
571147
zhlzt楼主2025/6/23 18:52
#include<bits/stdc++.h>
using namespace std;
const int maxn=1010;
const double pi=acos(-1);
double px[maxn],py[maxn],pr[maxn];
int n,vis[maxn];
pair<double,double>sta[maxn<<1];
int main(){
	scanf("%d",&n);
	for(int i=1;i<=n;i++) scanf("%lf%lf%lf",pr+i,px+i,py+i);
	double dis,tmpx,radx,rady,k;
	for(int i=1;i<=n;i++){
		for(int j=i+1;j<=n;j++){
			dis=sqrt((px[j]-px[i])*(px[j]-px[i])+(py[j]-py[i])*(py[j]-py[i]));
			if(dis+pr[i]<=pr[j]){
				vis[i]=1;
			}
		}
	}
	int tot;
	double ans=0;
	for(int i=1;i<=n;i++){
		if(vis[i]) continue;
		tot=0;
		for(int j=i+1;j<=n;j++){
			if(vis[j]) continue;
			dis=sqrt((px[j]-px[i])*(px[j]-px[i])+(py[j]-py[i])*(py[j]-py[i]));
			if(dis+pr[i]-pr[j]<=0) continue;
			if(dis+pr[j]-pr[i]<=0) continue;
			if(pr[i]+pr[j]-dis<=0) continue;
			tmpx=(pr[i]*pr[i]-pr[j]*pr[j]+dis*dis)/(2*dis);
			radx=acos(tmpx/pr[i]);
			if(px[i]==px[j]){
				if(py[i]<py[j]) rady=pi/2;
				else rady=pi*3/2;
			}
			else{
				k=(py[j]-py[i])/(px[j]-px[i]);
				rady=acos(1/(sqrt(1+k*k)));
				if(py[j]<py[i]) rady=pi*2-rady;
			}
			if(rady-radx<0){
				sta[++tot]=make_pair(rady-radx+pi*2,pi*2);
				sta[++tot]=make_pair(0,rady+radx);
			}
			else if(rady+radx>pi*2){
				sta[++tot]=make_pair(rady-radx,pi*2);
				sta[++tot]=make_pair(0,rady+radx-pi*2);
			}
			else{
				sta[++tot]=make_pair(rady-radx,rady+radx);
			}
		}
		sort(sta+1,sta+1+tot);
		double last=0,sum=pi*2;
		for(int j=1;j<=tot;j++){
			if(last<sta[j].first) sum-=sta[j].second-sta[j].first;
			else if(last<sta[j].second) sum-=sta[j].second-last;
			last=max(last,sta[j].second);
		}
		ans+=sum*pr[i];
	}
	printf("%.3f\n",ans);
	return 0;
}
2025/6/23 18:52
加载中...