Cod sursa(job #2525329)

Utilizator theo2003Theodor Negrescu theo2003 Data 17 ianuarie 2020 09:00:05
Problema Divk Scor 80
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.16 kb
#include <vector>
#include <fstream>
#include <algorithm>
using namespace std;
//ifstream cin("divk.in");
ofstream cout("divk.out");
int n, k, a, b, l[500001];
int ps[500002];
vector<int> sums[100001];
long long sequences = 0;
int main() {
    auto F = fopen("divk.in", "r");
    fscanf(F, "%d%d%d%d", &n, &k, &a, &b);
    a++;
    b++;
    for(int x = 1; x<=n; x++) {
        fscanf(F, "%d", &l[x]);
        l[x] %= k;
    }
    sums[0].push_back(0);
    for(int x = 1; x<=n; x++) {
        ps[x] += ps[x - 1] + l[x];
        ps[x] %= k;
        sums[ps[x]].push_back(x);
    }
    for(int x = 0; x<=100000; x++) {
        vector<int> close;
        vector<int> far;
        int ci = 0, fi = 0;
        for(int i = 0; i!=sums[x].size();i++) {
            close.push_back(sums[x][i]);
            while((close.size() - ci) && ((sums[x][i] - close[ci] + 1) >= a)) {
                far.push_back(close[ci]);
                ci++;
            }
            while((far.size() - fi) && ((sums[x][i] - far[fi] + 1) > b)) {
                fi++;
            }
            sequences += far.size() - fi;
        }
    }
    cout<<sequences<<endl;
}