Cod sursa(job #458705)

Utilizator popoiu.georgeGeorge Popoiu popoiu.george Data 25 mai 2010 21:23:11
Problema Oite Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.29 kb
#include<fstream>
#include<algorithm>
#include<bitset>
#define inf "oite.in"
#define outf "oite.out"
#define CMax 1100
#define DMax 1100000
#define SMax 4000000
#define MOD 1048576
using namespace std;

fstream f(inf,ios::in),g(outf,ios::out);

int L,C;
int v[CMax];
int nr,rez;
bitset<SMax> b;

struct suma { int t,a,b; };

suma s[DMax];

void read()
{
f>>C>>L;
for(int i=1; i<=C; i++) f>>v[i];
}

struct cmp
{
bool operator () (const suma &x, const suma &y)
    {
    if( x.t < y.t ) return true;
    return false;
    }
};

int cauta(int val,int st,int dr)
{
int m;
while( st<=dr )
    {
    m = (st+dr)/2 ;
    if( s[m].t == val ) return m;
    else if( s[m].t < val ) st = m+1 ;
    else if( s[m].t > val ) dr = m-1;
    }
return -1;
}

inline int merge(int i,int j)
{
if ( (s[i].a!=s[j].a) && (s[i].a!=s[j].b) && (s[i].b!=s[j].a) && (s[i].b!=s[j].b) ) return 1;
return 0;
}

inline int h(int a,int b,int c,int d)
{
int A[4];
A[0] = a; A[1]=b; A[2]=c; A[3]=d;
sort( A, A+3 );
return (A[0]*A[0]*A[0]*A[0])%MOD + (A[1]*A[1]*A[1]*A[1])%MOD + (A[2]*A[2]*A[2]*A[2])%MOD + (A[3]*A[3]*A[3]*A[3])%MOD;
}

/*inline void print(int i,int j)
{
g<<s[i].a<<" "<<s[i].b<<" "<<s[j].a<<" "<<s[j].b<<"\n";
}*/

void solve()
{
int p;
//toate sumele de 2 cifre
for(int i=1; i<C; i++)
    for(int j=i+1; j<=C; j++) s[++nr].t = v[i]+v[j] , s[nr].a = i , s[nr].b = j;
//sortez sumele
sort( s+1, s+nr+1, cmp() );
//for(int i=1; i<=nr; i++) g<<s[i].t <<" "<< s[i].a <<" "<< s[i].b <<"\n";
//rezolv
for(int i=1; i<nr; i++)
    {
    if( L-s[i].t < 0 ) break;
    p = cauta( L-s[i].t , i+1, nr ) ;
    if( p!=-1 )
        {
        if( merge(i,p) && !b[ h(s[i].a,s[i].b,s[p].a,s[p].b) ] ) rez++, b[ h(s[i].a,s[i].b,s[p].a,s[p].b) ] = 1;
        int j=p-1;
        while( s[j].t == L-s[i].t && j!=i )
            {
            if( merge(i,j) && !b[ h(s[i].a,s[i].b,s[j].a,s[j].b) ] ) rez++ , b[ h(s[i].a,s[i].b,s[j].a,s[j].b) ] = 1;
            j--;
            }
        j = p+1;
        while( s[j].t == L-s[i].t && j<=nr )
            {
            if( merge(i,j) && !b[ h(s[i].a,s[i].b,s[j].a,s[j].b) ] ) rez++, b[ h(s[i].a,s[i].b,s[j].a,s[j].b) ] = 1;
            j++;
            }
        }
    }
g<< rez;
}

int main()
{
read(); solve();
f.close(); g.close();
return 0;
}