Cod sursa(job #1785737)

Utilizator liviu23Liviu Andrei liviu23 Data 21 octombrie 2016 21:06:25
Problema Oite Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.32 kb
#include <algorithm>
#include <fstream>
#include <vector>
#include <iostream>
#define DIM 1028
#define M 7919
#define ll long long
#define f first
#define s second
using namespace std;

int c,v[DIM];
ll ans,l;
vector<pair<int,pair<int,int> > > h[M];

bool isCollision(pair<int,int> p1,pair<int,int> p2) {
    return (p1.f>=p2.f||p1.f>=p2.s||p1.s>=p2.f||p1.s>=p2.s);
}

void countComp(ll sum,pair<int,int> p) {
    if(sum<0)
        return;
    int i=sum%M,j=-1,st=0,dr=h[i].size()-1,mij;
    while(st<=dr) {
        mij=(st+dr)/2;
        if(h[i][mij].f==sum)
            dr=mij-1,j=mij;
        else if(h[i][mij].f<sum)
            st=mij+1;
        else
            dr=mij-1;
    }
    if(j<0)
        return;
    while(h[i][j].f==sum) {
        if(!isCollision(p,h[i][j].s))
            ans++;
        j++;
    }
}

int main()
{
    ios_base::sync_with_stdio(false);
    ifstream fin("oite.in");
    ofstream fout("oite.out");
    fin>>c>>l;
    for(int i=1;i<=c;i++)
        fin>>v[i];
    for(int i=1;i<=c;i++)
        for(int j=i+1;j<=c;j++)
            h[(v[i]+v[j])%M].push_back({v[i]+v[j],{i,j}});
    for(int i=0;i<M;i++)
        sort(h[i].begin(),h[i].end());
    for(int i=1;i<=c;i++)
    for(int j=i+1;j<=c;j++)
        countComp(l-(v[i]+v[j]),{i,j});
    fout<<ans;
    return 0;
}