Cod sursa(job #964554)

Utilizator geniucosOncescu Costin geniucos Data 21 iunie 2013 14:22:53
Problema Oite Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.99 kb
#include<cstdio>
#include<vector>
#include<algorithm>
using namespace std;
int S,i,j,n,mod,a[1050];
long long sol;
vector < pair < int , int > > v[666013];
vector < pair < int , int > >::iterator it;
void push(int n)
{
    int lin=n%mod;
    for(it=v[lin].begin();it!=v[lin].end();it++)
        if(it->first==n)
        {
            it->second++;
            return ;
        }
    v[lin].push_back(make_pair(n,1));
}
int query(int n)
{
    int lin=n%mod;
    for(it=v[lin].begin();it!=v[lin].end();it++)
        if(it->first==n) return it->second;
    return 0;
}
int main()
{
freopen("oite.in","r",stdin);
freopen("oite.out","w",stdout);
scanf("%d",&n);
scanf("%d",&S);
mod=666013;
for(i=1;i<=n;i++)
    scanf("%d",&a[i]);
sort(a+1,a+n+1);
push(a[1]+a[2]);
for(i=3;i<=n;i++)
{
    for(j=i+1;j<=n;j++)
    {
        if(a[i]+a[j]>S) break;
        sol+=query(S-a[i]-a[j]);
    }
    for(j=1;j<i;j++)
        push(a[j]+a[i]);
}
printf("%lld\n",sol);
return 0;
}