Cod sursa(job #2822136)

Utilizator GligarEsterabadeyan Hadi Gligar Data 23 decembrie 2021 16:45:17
Problema Oite Scor 90
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.47 kb
#include <fstream>
#include <vector>

using namespace std;

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

const int nmax=(1<<10), mod=997;

struct str{
    int nr, p;
};

int v[nmax+1];

vector <str> h[nmax+1];

str inh(int a, int b){
    str sol;
    sol.nr=a;
    sol.p=b;
    return sol;
}

int cautare(int x){
    int a=x%mod;
    for(int i=0;i<int(h[a].size());i++){
        if(h[a][i].nr==x){
            return i;
        }
    }
    return -1;
}

int main(){
    int n,l;
    fin>>n>>l;
    for(int i=1;i<=n;i++){
        fin>>v[i];
    }
    for(int i=3;i<=n-1;i++){
        for(int j=i+1;j<=n;j++){
            int sv=v[i]+v[j];
            int a=cautare(sv);
            if(a==-1){
                h[sv%mod].push_back(inh(sv,1));
            }else{
                h[sv%mod][a].p++;
            }
        }
    }
    int sol=0;
    for(int i=2;i<=n-2;i++){
        for(int j=1;j<=i-1;j++){
            if(l-v[i]-v[j]>=0){
                int a=cautare(l-v[i]-v[j]);
                if(a>-1){
                    sol+=h[(l-v[i]-v[j])%mod][a].p;
                }
            }
        }
        for(int j=i+2;j<=n;j++){
            int sv=v[i+1]+v[j];
            int a=cautare(sv), b=sv%mod;
            if(h[b][a].p==1){
                h[b][a]=h[b].back();
                h[b].pop_back();
            }else{
                h[b][a].p--;
            }
        }
    }
    fout<<sol<<"\n";
    return 0;
}