Cod sursa(job #1910669)

Utilizator TzeentchIoan-Teodor Tzeentch Data 7 martie 2017 17:51:34
Problema Numarare triunghiuri Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.39 kb
#include <iostream>
#include <fstream>
#include <cstdio>

using namespace std;

FILE* in = fopen("cautbin.in", "r");
FILE* out = fopen("cautbin.out", "w");

int a[800];

void interplasare(int st, int p, int dr){
    int c[800], k=0;
    int i=st, j=p+1;
    while(i<=p&&j<=dr){
        if(a[i]<a[j]){
            c[k++]=a[i++];
        }
        else c[k++]=a[j++];
    }
    while(i<=p){
        c[k++]=a[i++];
    }
    while(j<=dr){
        c[k++]=a[j++];
    }
    k=0;
    for(int i=st;i<=dr;i++){
        a[i]=c[k++];
    }
}

void srt(int st, int dr){
    if(st<dr){
        int p=st+(dr-st)/2;
        srt(st, p);
        srt(p+1, dr);
        interplasare(st, p, dr);
    }
}

int cbin(int x, int y, int st, int dr){
    int s=a[x]+a[y];
    while(st<=dr){
        int p=st+(dr-st)/2;
        if(a[p]<=s&&a[p+1]>s){
            return p-y;
        }
        else {
            if(a[p]>s){
                dr=p-1;
            }
            else st=p+1;
        }
    }
    return 0;
}

int main()
{
    int n, i, j, s=0;
    fscanf(in, "%d", &n);
    for(i=0;i<n;i++){
        fscanf(in, "%d", &a[i]);
    }
    srt(0, n-1);
    for(i=0;i<n-2;i++){
        int x=a[i];
        for(j=i+1;j<n-1;j++){
            int y=a[j];
            a[n]=x+y+1;
            s+=cbin(i, j, j+1, n-1);
        }
    }
    fprintf(out, "%d", s);
    return 0;
}