fork download
  1. #include <iostream>
  2. #include <math.h>
  3. using namespace std;
  4. #define max 1.8e+308
  5. int main() {
  6. int t;
  7. cin>>t;
  8. while(t>0)
  9. {
  10. double x1,x2,radius,y1,y2,c[2],x[2],y[2];
  11. cin>>x1>>y1;
  12. cin>>x2>>y2;
  13. double length=pow((pow((x2-x1),2.0)+pow(y2-y1,2.0)),0.5);
  14. long int t1;
  15. cin>>t1;
  16. while(t1>0)
  17. {
  18. cin>>x[0]>>y[0]>>radius;
  19. double c2=(x[0]*x[0])+(y[0]*y[0])-(radius*radius);
  20. c[0]=c2;
  21. double m=(y2-y1)/(x2-x1);
  22. x[1]=m;
  23. y[1]=1;
  24. double c1= y1-(m*x1);
  25. c[1]=c1;
  26. double D=pow((m*c1)-(y[0]*m)-x[0],2.0)-((1+(m*m))*((c1*c1)+c2-(2*y[0]*c1)));
  27. D*=4.0;
  28. double CD=0,arc=0,X1=0,X2=0,Y1=0,Y2=0;
  29. if(D>0)
  30. {
  31. X1=(pow(D,0.5)-(2*(m*c1-y[0]*m-x[0])))/(2*(1+(m*m)));
  32. X2=(-1)*(pow(D,0.5)+(2*(m*c1-y[0]*m-x[0])))/(2*(1+(m*m)));
  33. Y1=m*X1+c1;
  34. Y2=m*X2+c1;
  35. CD=pow(pow(X2-X1,2)+pow(Y2-Y1,2),0.5);
  36. arc=2*asin(CD/(2*radius));
  37. arc*=radius;
  38.  
  39. }
  40. length-=CD;
  41. length+=arc;
  42. t1--;
  43. }
  44. cout<<fmod(length,max)<<endl;
  45. t--;
  46. }
  47. // your code goes here
  48. return 0;
  49. }
Success #stdin #stdout 0s 3472KB
stdin
1 
-3 1 
3 1 
1 
0 0 2 
stdout
6.72469