Cod sursa(job #2306750)

Utilizator MoldovanAndrei1Moldovan Andrei MoldovanAndrei1 Data 22 decembrie 2018 20:30:09
Problema Divk Scor 50
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.14 kb
#include <bits/stdc++.h>
using namespace std;
int v[100005],dp[100005];
vector<int>rest[100005];
int main()
{
    freopen("divk.in","r",stdin);
    freopen("divk.out","w",stdout);
    int n,k,a,b,i,nr;
    scanf("%d%d%d%d",&n,&k,&a,&b);
    for(i=1;i<=n;i++)
    {
     scanf("%d",&nr);
     v[i]=v[i-1]+nr;
     v[i]%=k;
     rest[v[i]].push_back(i);
    }
    for(i=1;i<=n;i++)
    {
        int r1=v[i-1];
        int st=0,dr=rest[r1].size()-1;
        while(st<=dr)
        {
            int med=(st+dr)/2;
            if(rest[r1][med]<=(i-1))st=med+1;
            else
                dr=med-1;
        }
        if(st==rest[r1].size())
            dp[i]=n+1;
        else
            dp[i]=rest[r1][st];
    }
    int sol=0;
    dp[n+1]=n+1;
    for(i=1;i<=n;i++)
    {
        int j=i;
        int poz=dp[i];
        if(v[i]==v[i-1]){j++;
        if(a==1)sol++;}
        poz=dp[j];
        while(poz<=n)
        {
           int dif=poz-i;
           dif++;
           if(dif<=b&&dif>=a)sol++;
           poz=dp[poz+1];
           if(dif>b)break;
        }
    }
    printf("%d\n",sol);
    return 0;
}