Cod sursa(job #2216961)

Utilizator flibiaVisanu Cristian flibia Data 28 iunie 2018 14:49:51
Problema Oite Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.15 kb
#include <bits/stdc++.h>

using namespace std;

ifstream in("oite.in");
ofstream out("oite.out");

int n, L, a[2000];
vector <int> pairs, mp[1048];
long long ans;

int main(){
	in >> n >> L;
	for(int i = 1; i <= n; i++)
		in >> a[i];
	for(int i = 1; i <= n; i++){
		for(int j = 1; j <= n; j++){
			if(i == j)
				continue;
			mp[i].push_back(a[i] + a[j]);
			if(j > i)
				pairs.push_back(a[i] + a[j]);
		}
		sort(mp[i].begin(), mp[i].end());
	}
	sort(pairs.begin(), pairs.end());
	for(int i = 1; i < n; i++){
		for(int j = i + 1; j <= n; j++){
			int sum = a[i] + a[j];
			int sum2 = L - sum;
			if(L - sum < 0)
				continue;
			ans += (sum == L - sum);
			ans += upper_bound(pairs.begin(), pairs.end(), sum2) - pairs.begin();
			ans -= lower_bound(pairs.begin(), pairs.end(), sum2) - pairs.begin();
			ans -= upper_bound(mp[i].begin(), mp[i].end(), sum2) - mp[i].begin();
			ans += lower_bound(mp[i].begin(), mp[i].end(), sum2) - mp[i].begin();
			ans -= upper_bound(mp[j].begin(), mp[j].end(), sum2) - mp[j].begin();
			ans += lower_bound(mp[j].begin(), mp[j].end(), sum2) - mp[j].begin();
		}
	}
	out << ans / 6;
	return 0;
}