Pagini recente » Istoria paginii utilizator/milervladut | Cod sursa (job #213090) | Clasament dupa rating | Cod sursa (job #162376) | Cod sursa (job #521520)
Cod sursa(job #521520)
#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;
}