Language: C++

#include<iostream>
#include<complex>
#include<cmath>
#include<vector>
using namespace std;
#define REP(i,b,n) for(int i=b;i<n;i++)
#define rep(i,n)   REP(i,0,n)
typedef complex<double> P;

double dot(P a,P b){
  return a.real()*b.real()+a.imag()*b.imag();
}

//~ÌSÀWða,b,¼aðr1,r2Æ·éB
//r1Ær2ÌÔÌ£ðßÄ]·èÉæèr1Æ»ÌÓÌÈ·pðßéB
// ÆÍpolarðgÁÄÀWð¶¬·éB
//ñ_ÌÀWðÔ·B
pair<P,P> CC_intersection(P a,P b,double r1,double r2){//~Æ~Ìð_
  double r3 = abs(a-b);
  double theta = acos( (r1*r1 + r3*r3 -r2*r2)/(2*r1*r3) ); 
  if ( dot(polar(r1,theta),b-a) <0)theta=acos(-1)-theta;
  return make_pair(polar(r1,theta)+a,polar(r1,-theta)+a);
}

bool cmp(const P &a,const P&b){
  return arg(a)<arg(b);
}

class Circle{
public:
  vector<P> data;
};

double solve(int n,P *in,double *r){
  Circle data[n];
  double ret =0;
  rep(i,n){
    rep(j,n){
      if ( i==j)continue;
      if ( r[i]+r[j] <abs(in[i]-in[j]))continue;
      pair<P,P> a=CC_intersection(in[i],in[j],r[i],r[j]);
      data[i].data.push_back(a.first-in[i]);
      data[i].data.push_back(a.second-in[i]);
    }
  }
  
  rep(i,n){
    sort(data[i].data.begin(),data[i].data.end(),cmp);
  }

  rep(i,n){
    cout << i <<endl;
    rep(j,data[i].data.size()){
      cout << data[i].data[j] << " " << arg(data[i].data[j])<<endl;
    }
  }


  rep(i,n)rep(j,data[i].data.size())data[i].data[j]+=in[i];


  rep(i,n){
    int size=data[i].data.size();
    rep(j,size){
      P now = data[i].data[j]-in[i],nex=data[i].data[(j+1)%size]-in[i];
      P t=now;
      double theta = (arg(nex)-arg(now))/2;
      if (arg(nex)<0)theta=(acos(-1)*2+arg(nex)-arg(now))/2;
      
      P mid = P(t.real()*cos(theta)-t.imag()*sin(theta),t.real()*sin(theta)+t.imag()*cos(theta))+in[i];
      //      cout <<abs(mid-in[i]) <<" " <<  abs(now-in[i]) << " " << abs(nex-in[i]) << endl;
      //cout << abs(mid-now) << " " << abs(mid-nex) << endl;
      
      bool flag=true;
      rep(k,n){
	if ( i == k)continue;
	if (abs(in[k]-mid)<r[k]){cout << k << endl;flag=false;break;}
      }
            
      if ( flag)ret+=r[i]*abs(theta*2);

    }
  }
  return ret;
}

main(){
  int n;
  while(cin>>n&&n){
    P in[n];double r[n];
    rep(i,n)cin>>in[i].real()>>in[i].imag()>>r[i];
    printf("%.7lf\n",solve(n,in,r));
  }
  return false;
}

Compiler output:
a.cc: In function 'double solve(int, P*, double*)':
a.cc:48:5: error: 'sort' was not declared in this scope; did you mean 'sqrt'?
   48 |     sort(data[i].data.begin(),data[i].data.end(),cmp);
      |     ^~~~
      |     sqrt
a.cc: At global scope:
a.cc:87:1: warning: ISO C++ forbids declaration of 'main' with no type [-Wreturn-type]
   87 | main(){
      | ^~~~
a.cc: In function 'int main()':
a.cc:91:16: error: no match for 'operator>>' (operand types are 'std::istream' {aka 'std::basic_istream<char>'} and 'double')
   91 |     rep(i,n)cin>>in[i].real()>>in[i].imag()>>r[i];
      |             ~~~^~~~~~~~~~~~~~
      |             |              |
      |             |              double
      |             std::istream {aka std::basic_istream<char>}
In file included from /usr/include/c++/14/iostream:42,
                 from a.cc:1:
/usr/include/c++/14/istream:170:7: note: candidate: 'std::basic_istream<_CharT, _Traits>::__istream_type& std::basic_istream<_CharT, _Traits>::operator>>(bool&) [with _CharT = char; _Traits = std::char_traits<char>; __istream_type = std::basic_istream<char>]' (near match)
  170 |       operator>>(bool& __n)
      |       ^~~~~~~~
/usr/include/c++/14/istream:170:7: note:   conversion of argument 1 would be ill-formed:
a.cc:91:28: error: cannot bind non-const lvalue reference of type 'bool&' to a value of type 'double'
   91 |     rep(i,n)cin>>in[i].real()>>in[i].imag()>>r[i];
      |                  ~~~~~~~~~~^~
/usr/include/c++/14/istream:174:7: note: candidate: 'std::basic_istream<_CharT, _Traits>& std::basic_istream<_CharT, _Traits>::operator>>(short int&) [with _CharT = char; _Traits = std::char_traits<char>]' (near match)
  174 |       operator>>(short& __n);
      |       ^~~~~~~~
/usr/include/c++/14/istream:174:7: note:   conversion of argument 1 would be ill-formed:
a.cc:91:28: error: cannot bind non-const lvalue reference of type 'short int&' to a value of type 'double'
   91 |     rep(i,n)cin>>in[i].real()>>in[i].imag()>>r[i];
      |                  ~~~~~~~~~~^~
/usr/include/c++/14/istream:177:7: note: candidate: 'std::basic_istream<_CharT, _Traits>::__istream_type& std::basic_istream<_CharT, _Traits>::operator>>(short unsigned int&) [with _CharT = char; _Traits = std::char_traits<char>; __istream_type = std::basic_istream<char>]' (near match)
  177 |       operator>>(unsigned short& __n)
      |       ^~~~~~~~
/usr/include/c++/14/istream:177:7: note:   conversion of argument 1 would be ill-formed:
a.cc:91:28: error: cannot bind non-const lvalue reference of type 'short unsigned int&' to a value of type 'double'
   91 |     rep(i,n)cin>>in[i].real()>>in[i].imag()>>r[i];
      |                  ~~~~~~~~~~^~
/usr/include/c++/14/istream:181:7: note: candidate: 'std::basic_istream<_CharT, _Traits>& std::basic_istream<_CharT, _Traits>::operator>>(int&) [with _CharT = char; _Traits = std::char_traits<char>]' (near match)
  181 |       operator>>(int& __n);
      |       ^~~~~~~~
/usr/include/c++/14/istream:181:7: note:   conversion of argument 1 would be ill-formed:
a.cc:91:28: error: cannot bind non-const lvalue reference of type 'int&' to a value of type 'double'
   91 |     rep(i,n)cin>>in[i].real()>>in[i].imag()>>r[i];
      |                  ~~~~~~~~~~^~
/usr/include/c++/14/istream:184:7: note: candidate: 'std::basic_istream<_CharT, _Traits>::__istream_type& std::basic_istream<_CharT, _Traits>::operator>>(unsigned int&) [with _CharT = char; _Traits = std::char_traits<char>; __istream_type = std::basic_istream<char>]' (near match)
  184 |       operator>>(unsigned int& __n)
      |       ^~~~~~~~
/usr/include/c++/14/istream:184:7: note:   conversion of argument 1 would be ill-formed:
a.cc:91:28: error: cannot bind non-const lvalue reference of type 'unsigned int&' to a value of type 'double'
   91 |     rep(i,n)cin>>in[i].real()>>in[i].imag()>>r[i];
      |                  ~~~~~~~~~~^~
/usr/include/c++/14/istream:188:7: note: candidate: 'std::basic_istream<_CharT, _Traits>::__istream_type& std::basic_istream<_CharT, _Traits>::operator>>(long int&) [with _CharT = char; _Traits = std::char_traits<char>; __istream_type = std::basic_istream<char>]' (near match)
  188 |       operator>>(long& __n)
      |       ^~~~~~~~
/usr/include/c++/14/istream:188:7: note:   conversion of argument 1 would be ill-formed:
a.cc:91:28: error: cannot bind non-const lvalue reference of type 'long int&' to a value of type 'double'
   91 |     rep(i,n)cin>>in[i].real()>>in[i].imag()>>r[i];
      |                  ~~~~~~~~~~^~
/usr/include/c++/14/istream:192:7: note: candidate: 'std::basic_istream<_CharT, _Traits>::__istream_type& std::basic_istream<_CharT, _Traits>::operator>>(long unsigned int&) [with _CharT = char; _Traits = std::char_traits<char>; __istream_type = std::basic_istream<char>]' (near match)
  192 |       operator>>(unsigned long& __n)
      |       ^~~~~~~~
/usr/include/c++/14/istream:192:7: note:   conversion of argument 1 would be ill-formed:
a.cc:91:28: error: cannot bind non-const lvalue reference of type 'long unsigned int&' to a value of type 'double'
   91 |     rep(i,n)cin>>in[i].real()>>in[i].imag()>>r[i];
      |                  ~~~~~~~~~~^~
/usr/include/c++/14/istream:199:7: note: candidate: 'std::basic_istream<_CharT, _Traits>::__istream_type& std::basic_istream<_CharT, _Traits>::operator>>(long long int&) [with _CharT = char; _Traits = std::char_traits<char>; __istream_type = std::basic_istream<char>]' (near match)
  199 |       operator>>(long long& __n)
      |       ^~~~~~~~
/usr/include/c++/14/istream:199:7: note:   conversion of argument 1 would be ill-formed:
a.cc:91:28: error: cannot bind non-const lvalue reference of type 'long long int&' to a value of type 'double'
   91 |     rep(i,n)cin>>in[i].real()>>in[i].imag()>>r[i];
      |                  ~~~~~~~~~~^~
/usr/include/c++/14/istream:203:7: note: candidate: 'std::basic_istream<_CharT, _Traits>::__istream_type& std::basic_istream<_CharT, _Traits>::operator>>(long long unsigned int&) [with _CharT = char; _Traits = std::char_traits<char>; __istream_type = std::basic_istream<char>]' (near match)
  203 |       operator>>(unsigned long long& __n)
      |       ^~~~~~~~
/usr/include/c++/14/istream:203:7: note:   conversion of argument 1 would be ill-formed:
a.cc:91:28: error: cannot bind non-const lvalue reference of type 'long long unsigned int&' to a value of type 'double'
   91 |     rep(i,n)cin>>in[i].real()>>in[i].imag()>>r[i];
      |                  ~~~~~~~~~~^~
/usr/include/c++/14/istream:219:7: note: candidate: 'std::basic_istream<_CharT, _Traits>::__istream_type& std::basic_istream<_CharT, _Traits>::operator>>(float&) [with _CharT = char; _Traits = std::char_traits<char>; __istream_type = std::basic_istream<char>]' (near match)
  219 |       operator>>(float& __f)
      |       ^~~~~~~~
/usr/include/c++/14/istream:219:7: note:   conversion of argument 1 would be ill-formed:
a.cc:91:28: error: cannot bind non-const lvalue reference of type 'float&' to a value of type 'double'
   91 |     rep(i,n)cin>>in[i].real()>>in[i].imag()>>r[i];
      |                  ~~~~~~~~~~^~
/usr/include/c++/14/istream:223:7: note: candidate: 'std::basic_istream<_CharT, _Traits>::__istream_type& std::basic_istream<_CharT, _Traits>::operator>>(double&) [with _CharT = char; _Traits = std::char_traits<char>; __istream_type = std::basic_istream<char>]' (near match)
  223 |       operator>>(double& __f)
      |       ^~~~~~~~
/usr/include/c++/14/istream:223:7: note:   conversion of argument 1 would be ill-formed:
a.cc:91:28: error: cannot bind non-const lvalue reference of type 'double&' to an rvalue of type 'double'
   91 |     rep(i,n)cin>>in[i].real()>>in[i].imag()>>r[i];
      |                  ~~~~~~~~~~^~
/usr/include/c++/14/istream:227:7: note: candidate: 'std::basic_istream<_CharT, _Traits>::__istream_type& std::basic_istream<_CharT, _Traits>::operator>>(long double&) [with _CharT = char; _Traits = std::char_traits<char>; __istream_type = std::basic_istream<char>]' (near match)
  227 |       operator>>(long double& __f)
      |       ^~~~~~~~
/usr/include/c++/14/istream:227:7: note:   conversion of argument 1 would be ill-formed:
a.cc:91:28: error: cannot bind non-const lvalue reference of type 'long double&' to a value of type 'double'
   91 |     rep(i,n)cin>>in[i].real()>>in[i].imag()>>r[i];
      |                  ~~~~~~~~~~^~
/usr/include/c++/14/istream:328:7: note: candidate: 'std::basic_istream<_CharT, _Traits>::__istream_type& std::basic_istream<_CharT, _Traits>::operator>>(void*&) [with _CharT = char; _Traits = std::char_traits<char>; __istream_type = std::basic_istream<char>]'
  328 |       operator>>(void*& __p)
      |       ^~~~~~~~
/usr/include/c++/14/istream:328:25: note:   no known conversion for argument 1 from 'double' to 'void*&'
  328 |       operator>>(void*& __p)
      |                  ~~~~~~~^~~
/usr/include/c++/14/istream:122:7: note: candidate: 'std::basic_istream<_CharT, _Traits>::__istream_type& std::basic_istream<_CharT, _Traits>::operator>>(__istream_type& (*)(__istream_type&)) [with _CharT = char; _Traits = std::char_traits<char>; __istream_type = std::basic_istream<char>]'
  122 |       operator>>(__istream_type& (*__pf)(__istream_type&))
      |       ^~~~~~~~
/usr/include/c++/14/istream:122:36: note:   no known conversion for argument 1 from 'double' to 'std::basic_istream<char>::__istream_type& (*)(std::basic_istream<char>::__istream_type&)' {aka 'std::basic_istream<char>& (*)(std::basic_istream<char>&)'}
  122 |       operator>>(__istream_type& (*__pf)(__istream_type&))
      |                  ~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~
/usr/include/c++/14/istream:126:7: note: candidate: 'std::basic_istream<_CharT, _Traits>::__istream_type& std::basic_istream<_CharT, _Traits>::operator>>(__ios_type& (*)(__ios_type&)) [with _CharT = char; _Traits = std::char_traits<char>; __istream_type = std::basic_istream<char>; __ios_type = std::basic_ios<char>]'
  126 |       operator>>(__ios_type& (*__pf)(__ios_type&))
      |       ^~~~~~~~
/usr/include/c++/14/istream:126:32: note:   no known conversion for argument 1 from 'double' to 'std::basic_istream<char>::__ios_type& (*)(std::basic_istream<char>::__ios_type&)' {aka '