Here is the link to the problem:
https://www.codechef.com/DEM2020/problems/BEACIRC
Here is the link to my submission:
https://www.codechef.com/viewsolution/36693440
I thought of the problem for a complete 1 hour and could not come up with a solution. After that, I looked at the given sample test case and came up with a solution based on pure guesswork. Here is my approach:
Consider every pair of circles and try to find the 3rd circle which would match with the 2 circles following the properties given. Considering the first 2 circles as (x1,y1,r1) and (x2,y2,r2):
Find out two values value1 = (r1^2 + r2^2), value2 = (x1-x2)^2 + (y1-y2)^2
Here values1 is the sum of squares of the radii of the two circles and value2 is the square of the distance between the centers of the two circles.
If the 2 values are different there is no possible solution. If they are the same, then the radius of the third circle can be found out by the formula sqrt(value1/4). If this value is not an integer then again no possible solution. Otherwise, the final circle will have the following center and radius: ((x1+x2)/2, (y1+y2)/2, sqrt(value1/4)).
Now, finding the number of occurrences of such circles can be easily done by a map.
So, the total time complexity will be O(N^2Log(N)).
I don’t think this is the intended solution so thought I should share it. PS: I have no way to prove this is correct until now.
I was not able to solve the problem so thank you.
the link to your solution is wrong please update it I would really like to see it.
Done, thanks for telling me
1 Like
This is indeed correct solution.
Proof - Let the center of circles be c1, c2 and points of intersection be d1, d2.
Now, since the third circle should pass through all four points implies points c1, c2, d1, d2 forms a cyclic quadrilateral.
Now, using property- Sum of opposite angles of a cyclic quadrilateral is π, you can easily deduce that angle(c1,d1,c2) = angle(c1,d2,c2) = π/2.
@nprakhar Can you please help me in this problem Link
Yeah I just figured that out. Thanks for explaining it in a clearer way.
My AC code ,its quite neat just in case somebody wants to refer
AC_CODE
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define ar array
#define pb push_back
#define vi vector
#define FOR(i,j,n) for(int i=j;i<n;i++)
#define all(a) a.begin(),a.end()
int d(ar<int,3> a,ar<int,3>b){
return (a[0]-b[0])*(a[0]-b[0])+(a[1]-b[1])*(a[1]-b[1]);
}
bool ok(ar<int,3>a,ar<int,3>b){
return d(a,b)==a[2]*a[2]+b[2]*b[2] ;
}
void solve(){
int n ;cin >> n ;
vi<ar<int,3>>a(n) ;
FOR(i,0,n)
FOR(j,0,3)
cin >> a[i][j],a[i][j]*=2;
map<ar<int,3>,int >mp ;
for(ar<int,3> x:a)
mp[x]++ ;
set<ar<int,3>>s(all(a));a.clear() ;
for(ar<int,3> x:s)
a.pb(x);
n= a.size();int ans =0;
FOR(i,0,n){
FOR(j,i+1,n){
int di=d(a[i],a[j]),cd=sqrt(d(a[i],a[j]));
if(!ok(a[i],a[j])||di^(cd*cd))
continue ;
ar<int,3>ck ={(a[i][0]+a[j][0])/2,(a[i][1]+a[j][1])/2,cd/2};
ans+=mp[a[i]]*mp[a[j]]*mp[ck] ;
}
}
cout << ans << "\n" ;
}
signed main() {
int t ;cin >> t ;
while(t--)
solve() ;
}
@cubefreak777 I have done the same as you.
Can you please help me Link to submission
Our approaches look almost same ,you can try checking my solution to find what you missed ,one suggestion just multiply everything with 2 so that you dont have to check for the parity everytime
It is the intended solution (I am one of the problemsetters of the contest) - although using an unordered_map, you can do it in O(N^2) as well.
It is easily derived from cyclic quadrilateral property, or from the cosine law in trigonometry.