Cod sursa(job #595794)

Utilizator palcuiealexAlex Palcuie palcuiealex Data 14 iunie 2011 03:09:12
Problema Numarare triunghiuri Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.09 kb
/***************************************************
 * Author: Alexandru Palcuie
 * Country: Romania
 * Email: alex [dot] palcuie [at] gmail [dot] com
 * Website: http://palcu.blogspot.com/
 * Year: 2011
****************************************************/

#include <vector>
#include <list>
#include <map>
#include <set>
#include <deque>
#include <stack>
#include <queue>
#include <bitset>
#include <algorithm>
#include <functional>
#include <numeric>
#include <utility>
#include <sstream>
#include <iostream>
#include <iomanip>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <ctime>
#include <cstring>

using namespace std;

typedef vector<int> VI;
typedef vector<pair<int,int> > VPI;
typedef pair<int,int> PII;
typedef long long LL;
typedef unsigned long long ULL;

//Constants
const int NMAX = 1024;

//Global Vars
pair<int,int> v[NMAX];

//Structs

//Solve Functions
inline bool sortMethod(PII a, PII b){
        return a.second < b.second;
}

inline bool myBinarySearch(int left, int right, int value){
        int mid;
        while(left<=right){
                mid = (left+right) / 2;
                if (v[mid].second <= value)
                        return true;
                if (v[mid].second<value){
                        left = mid+1;
                }
                else{
                        right = mid-1;
                }
        }
        return false;
}

int main(){
        #ifndef ONLINE_JUDGE
        freopen("nrtri.in","r",stdin);
        freopen("nrtri.out","w",stdout);
        #endif

        int n; scanf("%d",&n); int i,j,x,sol=0;
        for(i=1;i<=n;++i){
                scanf("%d",&x);
                v[i].first=i;
                v[i].second=x;
        }

        sort(v+1,v+n+1,sortMethod);

        for(i=1;i<=n;++i){
                for(j=i+1;j<=n;++j){
                        x=v[i].second+v[j].second;
                        if (myBinarySearch(j+1,n,x))
                                ++sol;
                }
        }

        printf("%d\n",sol);

        return 0;

}