Cod sursa(job #521520)

Utilizator mgntMarius B mgnt Data 12 ianuarie 2011 19:12:21
Problema Oite Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.15 kb
#include <cstdio>
#include <algorithm>
using namespace std;

struct Node{int v,f;Node*n;};

typedef long long int lli;
int const maxn=1024,maxv=500*1000*1000;
int C,L,A[maxn];

Node S[2+(maxn*(maxn-1))/2];
int N;
void init()
{	S[0].v=maxv;S[0].f=1;S[0].n=&S[1];;
	S[1].v=-1;S[1].f=1;S[1].n=0;N=2;
}
void insert(int v)
{	Node*p=&S[0];
	while((p->n->v)>v)
	{p=p->n;}
	if((p->n->v)==v)
	{++p->n->f;}
	else
	{	Node*q=&S[N++];
		q->v=v;q->f=1;q->n=p->n;
		p->n=q;
	}
}
void search(int v,Node*&q)
{	Node*p=q;
	while((p->v)>v){p=p->n;}
	q=p;
}

int solve()
{	int s,t,v;
	lli c;Node*q;
	make_heap(A,A+C);
	sort_heap(A,A+C);
	// A[i]<=A[j]<=A[s]<=A[t]
	// i<j<s<t
	// A[i]+A[j]+A[s]+A[t]=L
	init();c=0;
	for(s=0;C>s;++s)
	{	q=&S[0];
		for(t=s+1;C>t;++t)
		{	v=A[s]+A[t];
			if(((L/2)<=v)&&(v<=L))
			{	search(L-v,q);
				if(q->v==(L-v))
				{c+=q->f;}
			}
		}
		for(t=0;t<s;++t)
		{insert(A[t]+A[s]);}
	}
	return c;
}

int main()
{	freopen("oite.in","r",stdin);
	freopen("oite.out","w",stdout);
	scanf("%d %d",&C,&L);int i;
	for(i=0;C>i;++i){scanf("%d",&A[i]);}
	lli ans=solve();
	printf("%lld\n",ans);
	return 0;
}