感觉思路没问题,但不知道那没想到!
#include<bits/stdc++.h>
using namespace std;
#define db double
int n;
db x,y,m;
struct node{
db x1,y1;
db x2,y2;
db x3,y3;
db m;
}e[2001];
bool cmp(node a,node b){
return a.x1<b.x1;
}
db ans=0;
int main(){
//1、声明变量,输入
cin>>n;
for(int i=1;i<=n;i++){
cin>>x>>y>>m;
e[i]={x,y,x+m,y,x,y+m,m};
ans+=m*m/2;
}
//cout<<ans<<endl;
//2、计算过程
sort(e+1,e+1+n,cmp);
for(int i=1;i<=n-1;i++){
for(int j=i+1;j<=n;j++){
db b=e[i].x2+e[i].y2;
db xx=b-e[j].y1;
if(xx>e[j].x1 && e[i].y2<=e[j].y2){
db c=xx-e[j].x1;
if(c>=e[j].m){
ans-=e[j].m*e[j].m/2;
//cout<<ans<<' '<<i<<' '<<j<<endl;
}else{
ans-=c*c/2;
//cout<<ans<<' '<<i<<' '<<j<<endl;
}
}else if(e[i].y2<e[j].y3 && e[i].y2>e[j].y2 && e[i].x2>e[j].x3){
if(e[i].x2>e[j].x3){
db c=e[j].y3-e[i].y2;
ans-=c*c/2;
//cout<<ans<<' '<<i<<' '<<j<<endl;
}else{
db c=e[i].x2-e[j].y3;
ans-=c*c/2;
//cout<<ans<<' '<<i<<' '<<j<<endl;
}
}
}
}
//3、输出
cout<<fixed<<setprecision(1)<<ans;
return 0;
}