Cod sursa(job #1772015)

Utilizator NinjaCubeMihai Radovici NinjaCube Data 6 octombrie 2016 13:40:52
Problema Oite Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.14 kb
#include <stdio.h>
#include <algorithm>
#define MOD 654321
#define MAX 1025

int v[MAX],next[MAX*MAX],lista[MOD],p;

int sum[MAX*MAX], sumx[MAX*MAX],sumy[MAX*MAX];
void adauga(int val,int a,int b){
    p++;
    sum[p]=val;
    sumx[p]=a;
    sumy[p]=b;
    next[p]=lista[val % MOD];
    lista[val % MOD]=p;
}
long long cauta(int val,int a,int b){
    long long rasp=0;
    if(val<=0)
        return 0;
    int modulo =lista[val % MOD];
    while(modulo != 0){
        if(sum[modulo]==val&&sumx[modulo]>b&&sumy[modulo]>b)
            rasp++;
        modulo=next[modulo];
    }
    return rasp;
}

int main(){
    FILE *fin,*fout;
    fin=fopen("oite.in","r");
    fout=fopen("oite.out","w");

    int i,j,n,l;
    long long rasp=0;
    fscanf(fin,"%d%d",&n,&l);
    for(i=1;i <= n;i++)
        fscanf(fin,"%d",&v[i]);
    std::sort(v+1,v+n+1);
    for(i=1;i < n;i++)
        for(j=i+1;j <= n;j++)
            adauga(v[i]+v[j],i,j);
    for(i=1;i<n;i++)
        for(j=i+1;j <= n;j++)
            rasp=rasp + cauta(l-(v[i]+v[j]),i,j);

    fprintf(fout, "%lld",rasp);

    fclose(fin);
    fclose(fout);
    return 0;
}