提交时间:2025-05-08 12:24:13

运行 ID: 37749

#include<bits/stdc++.h> #define up(i,l,r) for(int i=(l);i<=(r);++i) #define down(i,l,r) for(int i=(l);i>=(r);--i) #define pi pair<int,int> #define p1 first #define p2 second #define m_p make_pair #define p_b push_back using namespace std; typedef long long ll; typedef long double db; const int maxn=1e5+10; inline ll read(){ ll x=0;short t=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')t=-1;ch=getchar();} while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar(); return x*t; } int n; struct nd { int x,y,l; }d[maxn]; bool operator<(nd a,nd b){ if(a.x!=b.x)return a.x<b.x; if(a.y!=b.y)return a.y<b.y; return a.l<b.l; } map<nd,db>f[105],g[105]; db ans[105],C[105][105]; void slv(){ n=read(); C[0][0]=1; up(i,1,n){ C[i][0]=1; up(j,1,i)C[i][j]=C[i-1][j-1]+C[i-1][j]; } up(i,1,n)d[i].x=read(),d[i].y=read(),d[i].l=read(); up(i,1,n){ up(j,1,i)g[j].clear(); g[1][d[i]]=1; up(j,1,i-1)for(auto it:f[j])g[j][it.p1]+=it.p2; auto in=[](nd a,int x,int y){ return x>=a.x&&x<=a.x+a.l&&y>=a.y&&y<=a.y+a.l-(x-a.x); }; up(j,1,i-1)for(auto it:f[j]){ auto calc=[&](nd a,int L,int x,int y){ int l=0,r=L+1; while(l+1<r){ int mid=l+r>>1; if(in(a,x+mid,y))l=mid; else r=mid; } g[j+1][(nd){x,y,l}]+=it.p2; }; auto chk=[&](nd a,nd b){ if(in(a,b.x,b.y)){calc(a,b.l,b.x,b.y);return 1;} else if(in(a,b.x+b.l,b.y)){calc(a,b.x+b.l-a.x,a.x,b.y);return 1;} else if(in(a,b.x,b.y+b.l)){calc(a,b.y+b.l-a.y,b.x,a.y);return 1;} return 0; }; if(chk(it.p1,d[i])); else chk(d[i],it.p1); } up(j,1,i)f[j].swap(g[j]); } up(j,1,n)for(auto it:f[j])ans[j]+=it.p2*it.p1.l*it.p1.l/2; db res=0; down(i,n,1){ up(j,i+1,n)ans[i]-=ans[j]*C[j][i]; if(i&1)res+=ans[i]; } printf("%.1f",res); } int main(){ //freopen("triangle.in","r",stdin),freopen("triangle.out","w",stdout); slv(); fclose(stdin),fclose(stdout); return 0; }