第9测试点TLE 悬关
#include<bits/stdc++.h>
using namespace std;
struct tri
{
int x,y,m,s;
bool operator==(const tri &p)
{
return (this->x==p.x)&&(this->y==p.y)&&(this->m==p.m);
}
};
deque<tri> t;
int n;
double sum;
int t_add(tri a,int l)
{
int s=t.size();
int i;
bool f=true;
for(i=l;i<s;i++)
if(t[i]==a)
{
t[i].s++;
f=false;
break;
}
if(f)
{
a.s=1;
t.push_back(a);
}
return f;
}
double trisize(tri a)
{
return (a.m*1.0)*(a.m*1.0)/2.0;
}
int aljdge(tri a,tri b)//A被B完全盖住 al:all
{
if(a.x<b.x||a.y<b.y)return 0;
if(a.m>b.m)return 0;
if(a.x+a.m+a.y-b.y>b.x+b.m)return 0;
return 1;
}
int rcjdge(tri a,tri b)//A的右角被B盖住 rc:right corner
{
if(a.x>=b.x||a.x+a.m<=b.x)return 0;
if(a.y<b.y||a.y>b.y+b.m)return 0;
if(a.x+a.m-b.x+a.y>b.y+b.m)return 0;
return 1;
}
double rcsize(tri a,tri b)
{
int s=a.x+a.m-b.x;
return (s*1.0)*(s*1.0)/2.0;
}
tri rctri(tri a,tri b)
{
tri r;
r.x=b.x;
r.y=a.y;
r.m=a.x+a.m-b.x;
return r;
}
int ucjdge(tri a,tri b)//A的上角被B盖住 uc:up corner
{
if(a.y>=b.y||a.y+a.m<=b.y)return 0;
if(a.x<b.x||a.x>b.x+b.m)return 0;
if(a.x+a.m-b.y+a.y>b.x+b.m)return 0;
return 1;
}
double ucsize(tri a,tri b)
{
int s=a.y+a.m-b.y;
return (s*1.0)*(s*1.0)/2.0;
}
tri uctri(tri a,tri b)
{
tri r;
r.x=a.x;
r.y=b.y;
r.m=a.y+a.m-b.y;
return r;
}
int hyjdge(tri a,tri b)//A的斜边被B盖住 hy:hypotenuse
{
if(a.x>=b.x||a.y>=b.y)return 0;
if(a.x+a.m<=b.x||a.y+a.m<=b.y)return 0;
if(b.x-a.x+b.y-a.y>=a.m)return 0;
if(b.x+b.m-a.x+b.y-a.y<=a.m)return 0;
return 1;
}
double hysize(tri a,tri b)
{
int s=a.m-b.y+a.y-b.x+a.x;
return (s*1.0)*(s*1.0)/2.0;
}
tri hytri(tri a,tri b)
{
tri r;
r.x=b.x;
r.y=b.y;
r.m=a.m-b.x+a.x-b.y+a.y;
return r;
}
int main()
{
int i,j,k,x;
tri a,b;
cin>>n;
for(i=1;i<=n;i++)
{
cin>>a.x>>a.y>>a.m;
a.s=1;
t.push_back(a);
}
x=1;
while(!t.empty())
{
int l=t.size();
// cout<<l<<endl;
for(i=0;i<l;i++)
{
a=t[i];
// printf("%d %d %d %d\n",a.x,a.y,a.m,a.s);
sum+=x*trisize(a)*a.s;
for(j=0;j<i;j++)
{
b=t[j];
if(aljdge(a,b))t_add(a,l);
if(rcjdge(a,b))t_add(rctri(a,b),l);
if(ucjdge(a,b))t_add(uctri(a,b),l);
if(hyjdge(a,b))t_add(hytri(a,b),l);
if(aljdge(b,a))t_add(b,l);
if(rcjdge(b,a))t_add(rctri(b,a),l);
if(ucjdge(b,a))t_add(uctri(b,a),l);
if(hyjdge(b,a))t_add(hytri(b,a),l);
}
}
for(i=0;i<l;i++)
t.pop_front();
x=0-x;
// printf("%.1f\n",sum);
// cout<<endl;
}
printf("%.1f",sum);
}