Cod sursa(job #51066)

Utilizator cos_minBondane Cosmin cos_min Data 9 aprilie 2007 20:37:14
Problema Oite Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.04 kb
// N^3 * log N 
#include <stdio.h>
#include <fstream>
#include <algorithm>
using namespace std;

#define in "oite.in"
#define out "oite.out"
#define dim 1025

int C[dim];
bool sel[2000001];
int N, L, S;
int t = 0; 

bool Search(int st, int dr, int val);
void Qsort(int,int);

int main()
{
    freopen(in,"r",stdin);
    freopen(out,"w",stdout);
    
    for ( int i = 1; i <= 1000000; i++ )
        sel[i] = 0;
    
    scanf("%d%d", &N, &L);
    for ( int i = 1; i <= N; i++ )
        scanf("%d", &C[i]), sel[C[i]] = 1;
    
    Qsort(1,N);
    //sort(C+1,C+N+1); 
    
    /*for ( int i = 1; i <= N; i++ )
        printf("%d ", C[i]);*/
    
    t = 0;
    
    for ( int i = 1; i < N-1; i++ )
        for ( int j = i+1; j < N; j++ )
            for ( int k = j+1; k <= N; k++ )
            {
                S = L - C[i] - C[j] - C[k];
                if ( ( S < 0 ) || ( S < C[k] ) || ( S == C[k] && C[k+1] != S ) ) continue;
                else
                {
                    if ( sel[S] == 1 )
                    {
                        // printf("%d %d %d\n", i, j, k);
                         t += 1;
                    }
                }
            }
    
    printf("%d", t);
}

void Qsort(int st, int dr)
{
     int i = st - 1;
     int j = dr + 1;
     int pivot = C[st];
     
     while ( i <= j )
     {
           do { i++; } while ( C[i] < pivot );
           do { j--; } while ( C[j] > pivot );
           if ( i <= j )
           {
                int aux = C[i];
                C[i] = C[j];
                C[j] = aux;
           }
     }
     
     if ( st < j ) Qsort(st,j);
     if ( i < dr ) Qsort(i,dr);
}

bool Search(int st, int dr, int val)
{
     int mij = 0;
     bool ok = 0;
     
     while ( st <= dr )
     {
           int mij = (st+dr)>>1;
           
           if ( C[mij] == val ) ok = 1, st = dr + 1;
           else if ( C[mij] > val ) dr = mij - 1;
           else if ( C[mij] < val ) st = mij + 1;
     }
     
     return ok;
}