Wikipedia

Search results

Saturday 31 October 2015

Hackerrank: counting triangles (Codestorm 2015)

Coming up with a great solution :-)
For....
https://www.hackerrank.com/contests/codestorm/challenges/ilia

#include<bits/stdc++.h>
using namespace std;
#define ll long long int
#define N 1000100

ll a[N];
map<ll,ll> mp1;

int main(){     
    ll n,p,q,r,s=0,rt=0,ac=0,ob=0;
    memset(a,0,sizeof(a));
    cin >> n;
    for(int A_i = 0;A_i < n;A_i++){
       cin >> a[A_i];
       mp1[a[A_i]]++;
    }
    a[n]=INT_MAX;
    for(int i=0;i<n;i++){
        for(int j=i+1;j<n;j++){
            p=lower_bound(a+j+1,a+n+1,(a[i]+a[j]))-a;
            q=a[i]*a[i]+a[j]*a[j];
            if((ll)sqrt(q)*(ll)sqrt(q)==q){
                    r=sqrt(q);
                    if(mp1[r]==1)
                        rt++;
            }
            if(j+1>=p) continue;
            if((ll)sqrt(q)*(ll)sqrt(q)==q)
                s=lower_bound(a+j+1,a+p,(ll)sqrt(q))-a;
            else
                s=lower_bound(a+j+1,a+p,(ll)sqrt(q)+1)-a;
            if(s>j+1) ac+=(s-(j+1));
            if(a[s]==(ll)sqrt(q) && (ll)sqrt(q)*(ll)sqrt(q)==q)
                ob+=(p-s-1);
            else
                ob+=(p-s);
        }
    }
    cout<<ac<<" "<<rt<<" "<<ob;
    mp1.clear();
   
    // your code goes here
    return 0;
}

No comments:

Post a Comment