Cod sursa(job #2525350)

Utilizator theo2003Theodor Negrescu theo2003 Data 17 ianuarie 2020 10:09:24
Problema Divk Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.55 kb
#include <vector>
#include <fstream>
using namespace std;
ofstream cout("divk.out");
char buf[5500000];
int chari = 0;
int readint(){
    while(!((buf[chari] >= '0') && (buf[chari] <= '9'))){
        chari++;
    }
    int result = 0;
    while((buf[chari] >= '0') && (buf[chari] <= '9')){
        result *= 10;
        result += buf[chari] - '0';
        chari++;
    }
    return result;
}
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");
    fread(buf, sizeof(char), 5500000, F);
    n = readint(), k = readint(), a = readint(), b = readint();
    a++;
    b++;
    sums[0].process(0);
    for(int x = 1, tmp, last = 0; x<=n; x++) {
        tmp = readint();
        last += tmp;
        last %= k;
        sums[last].process(x);
    }
    cout<<sequences<<endl;
}