Cod sursa(job #1909979)

Utilizator valentin50517Vozian Valentin valentin50517 Data 7 martie 2017 14:57:22
Problema Oite Scor 30
Compilator cpp Status done
Runda lasm07.03.2017 Marime 1.09 kb
#include<bits/stdc++.h>
typedef long long ll;
using namespace std;
unordered_map<ll,vector<pair<int,int> > > M;
unordered_set<ll> sum;
ll S,N,A[1050],rs,brut;
int main(){
    ifstream cin("oite.in");
    ofstream cout("oite.out");
    cin >> N >> S;
    for(int i = 0;i<N;i++) cin >> A[i];
    sort(A,A+N);
    for(int i = 0;i<N;i++)
        for(int j = i+1;j<N;j++) if(A[i]+A[j]<=S) M[A[i]+A[j]].push_back(make_pair(i,j));
    
    for(int i = 0;i<N;i++)
        for(int j = i+1;j<N;j++) if(A[i]+A[j]<=S && sum.find(A[i]+A[j]) == sum.end()){
            ll sum1 = A[i]+A[j], sum2=S-A[i]-A[j];
            sum.insert(sum1); sum.insert(sum2);
            if(M[sum2].empty()) continue;
            vector<pair<int,int> > tmp;
            for(auto& it:M[sum1]) tmp.push_back(make_pair(it.second,it.first));
            sort(tmp.begin(),tmp.end());
            sort(M[sum2].begin(),M[sum2].end());
            
            for(auto& it:tmp)  rs+=0LL+M[sum2].size()-(upper_bound(M[sum2].begin(),M[sum2].end(),make_pair(it.first,1<<20))-M[sum2].begin());
        } 
    cout << rs;          
}