Pagini recente » Cod sursa (job #959299) | Cod sursa (job #1927580) | Cod sursa (job #499753) | Cod sursa (job #661934) | Cod sursa (job #389360)
Cod sursa(job #389360)
#include <cstdio>
#include <vector>
#include <algorithm>
#include <ctime>
using namespace std;
#define file_in "oite.in"
#define file_out "oite.out"
#define mod 100007
#define Nmax 2297378
long long my_time;
long long nr;
int v[Nmax],s,n;
vector<int> G1[mod+10];
vector<long long> G2[mod+10];
char q[2974947];
int x;
void add2(int x)
{
int k=x%mod;
G1[k].push_back(x);
}
int find2(int x)
{
vector<int> :: iterator it;
int k=x%mod;
int cnt=0;
for (it=G1[k].begin();it!=G1[k].end();++it)
if (*it==x)
cnt++;
return cnt;
}
void sterge2(int x)
{
int k=x%mod;
vector<int> :: iterator it;
for (it=G1[k].begin();it!=G1[k].end();++it)
if (*it==x)
{
G1[k].erase(it);
return ;
}
}
void add1(int x)
{
int k=x%mod;
G2[k].push_back(x);
}
int find1(int x)
{
vector<long long> :: iterator it;
int k=x%mod;
int cnt=0;
for (it=G2[k].begin();it!=G2[k].end();++it)
if (*it==x)
cnt++;
return cnt;
}
void sterge1(int x)
{
int k=x%mod;
vector<long long> :: iterator it;
for (it=G2[k].begin();it!=G2[k].end();++it)
if (*it==x)
{
G2[k].erase(it);
return ;
}
}
int main()
{
//my_time=clock();
int i,j;
freopen(file_in,"r",stdin);
scanf("%d %d\n", &n, &s);
//for (i=1;i<=n;++i)
//{
// scanf("%d", &v[i]);
//}
gets(q);
int l=strlen(q);
i=0;
n=0;
while(i<l)
{
x=0;
while(q[i]>='0' && q[i]<='9')
{
x=x*10+q[i]-'0';
i++;
}
v[++n]=x;
i++;
}
fclose(stdin);
sort(v+1,v+n+1);
if (n<=560)
{
for (i=3;i<n;++i)
for (j=i+1;j<=n;++j)
add1(v[i]+v[j]);
nr=0;
for (j=2;j<n-1;++j)
{
for (i=1;i<j;++i)
nr+=find1(s-v[i]-v[j]);
for (i=j+2;i<=n;++i)
sterge1(v[j+1]+v[i]);
}
}
else
{
for (i=3;i<n;++i)
for (j=i+1;j<=n;++j)
add2(v[i]+v[j]);
nr=0;
for (j=2;j<n-1;++j)
{
for (i=1;i<j;++i)
nr+=find2(s-v[i]-v[j]);
for (i=j+2;i<=n;++i)
sterge2(v[j+1]+v[i]);
}
}
freopen(file_out,"w",stdout);
printf("%lld\n", nr);
//printf("%.4lf\n", (double)((double)clock()-my_time)/CLOCKS_PER_SEC);
fclose(stdout);
return 0;
}