Cod sursa(job #2525346)

Utilizator theo2003Theodor Negrescu theo2003 Data 17 ianuarie 2020 09:54:23
Problema Divk Scor 80
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.18 kb
#include <vector>
#include <fstream>
using namespace std;
ofstream cout("divk.out");
int n, k, a, b;
unsigned long long sequences = 0;
struct node {
    node *next = NULL;
    int val = 0;
};
node *mem = new node[700000];
struct distances {
    node *far = NULL, *close = NULL, *last = NULL;
    int fari = 0, closei = 0;
    void process(int i) {
        last->next = mem;
        last = mem++;
        last->val = i;
        while((far->next != NULL) && ((i - far->next->val + 1) > b)){
            far = far->next;
            fari++;
        }
        while((close->next != NULL) && ((i - close->next->val + 1) >= a)){
            close = close->next;
            closei++;
        }
        sequences += (closei - fari);
    }
    distances(){
        far = mem++;
        close = far;
        last = close;
    }
};
distances sums[100001];
int main() {
    auto F = fopen("divk.in", "r");
    fscanf(F, "%d%d%d%d", &n, &k, &a, &b);
    a++;
    b++;
    sums[0].process(0);
    for(int x = 1, tmp, last = 0; x<=n; x++) {
        fscanf(F, "%d", &tmp);
        last += tmp;
        last %= k;
        sums[last].process(x);
    }
    cout<<sequences<<endl;
}