http://acm.hdu.edu.cn/showproblem.php?pid=6354
#include<iostream>
#include<stdio.h>
#include<math.h>
#define PI acos(-1.0)
using namespace std;
int main()
{
int t;
scanf("%d",&t);
double a1,b1,r1,a2,b2,r2,d;
double A1,A2,s1,s2,s;
while(t--)
{
double ans=0;
a1=b1=0;
int hh;
scanf("%d %lf",&hh,&r1);
ans=2*PI*r1;
for(int i=1;i<=hh;i++)
{
scanf("%lf%lf%lf",&a2,&b2,&r2);
d=sqrt((a2)*(a2)+(b2)*(b2));
if(d>=r1+r2)
{
ans+=0;
continue;
}
else
if(d==fabs(r1-r2))//内切
{
ans+=PI*r2*2;
continue;
}
else
if(d<r1+r2&&d>fabs(r1-r2))//两个圆相交的情况
{
A1=2*acos((d*d+r1*r1-r2*r2)/(2*d*r1));//圆盘的圆心角,余弦公式
A2=2*acos((d*d+r2*r2-r1*r1)/(2*d*r2));//输入圆的圆心角
ans-=A1*r1;//弧长公式
ans+=A2*r2;
continue;
}
}
printf("%.20lf\n",ans);
}
return 0;
}