Cod sursa(job #1512329)

Utilizator mariakKapros Maria mariak Data 27 octombrie 2015 22:03:35
Problema Divk Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.03 kb
#include <cstdio>
#include <algorithm>
#include <deque>
#define Dim 500002

using namespace std;
int n, k, a, b, x, s1, s2;
long long Sol;
deque <int> d[Dim/2];
deque <int> aux;

int main()
{
    int i;
    freopen("divk.in", "r", stdin);
    freopen("divk.out", "w", stdout);
    scanf("%d %d %d %d", &n, &k, &a, &b);
    d[0].push_back(0);
    for(i = 1; i <= n; ++ i)
    {
        scanf("%d", &x);
        s2 = (s1 + x) % k;
        d[s2].push_back(i);
        if(i >= a)
        {
            while(!d[s2].empty() && d[s2].front() < i - b)
                d[s2].pop_front();
            while(!d[s2].empty() && i - d[s2].back() + 1 <= a)
            {
                aux.push_back(d[s2].back());
                d[s2].pop_back();
            }
            Sol = Sol + d[s2].size() * 1LL;
            while(!aux.empty())
            {
                d[s2].push_back(aux.front());
                aux.pop_front();
            }
        }
        s1 = s2;
    }
    printf("%lld", Sol);
    return 0;
}