Cod sursa(job #2777339)

Utilizator etienAndrone Stefan etien Data 22 septembrie 2021 23:30:46
Problema Divk Scor 60
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.47 kb
#include<bits/stdc++.h>
using namespace std;
ifstream fin("divk.in");
ofstream fout("divk.out");
vector<int>v[100001];
int main()
{
    int n,a,b,i,x,k;
    long long s=0,nr=0;
    v[0].push_back(0);
    fin>>n>>k>>a>>b;
    for(i=1;i<=n;i++)
    {
        fin>>x;
        s=s+x;
        s%=k;
        v[s].push_back(i);
    }
    for(i=0;i<=k;i++)
    {
        cout<<i<<": ";
        for(auto q:v[i])
            cout<<q<<" ";
        cout<<endl;
    }
    for(i=0;i<=k;i++)
    {
        if(v[i].size()>=2)
        {
            for(int j=0;j<v[i].size();j++)
            {
                int st=j+1,dr=v[i].size()-1,mi,poz1=-1,poz2=-1;
                while(st<=dr)
                {
                    mi=(st+dr)/2;
                    if(v[i][j]+a<=v[i][mi])
                    {
                        poz1=mi;
                        dr=mi-1;
                    }
                    else st=mi+1;
                }
                st=1;dr=v[i].size()-1;
                while(st<=dr)
                {
                    mi=(st+dr)/2;
                    if(v[i][j]+b>=v[i][mi])
                    {
                        poz2=mi;
                        st=mi+1;
                    }
                    else dr=mi-1;
                }
                if(poz1!=-1&&poz2!=-1)
                {
                    int x=poz2-poz1+1;
                    nr+=x;
                }
            }
        }
    }
    fout<<nr;
}