Cod sursa(job #1568283)

Utilizator florin.elfusFlorin Elfus florin.elfus Data 14 ianuarie 2016 03:50:40
Problema Secventa 5 Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.19 kb
#include <bits/stdc++.h>

using namespace std;

int x[500010];
int f[1000100];

int cnt, n, k;

bool good(int pos) {
    if (pos > n)
        return 0;
    if (cnt < k) {
        cnt += (f[x[pos]] == 0);
        ++f[x[pos]];
        return 1;
    }
    if (cnt == k) {
        if (f[x[pos]] == 0)
            return 0;
        ++f[x[pos]];
        return 1;
    }
}

long long solve(int n, int _k) {
    int i, ptr = 0, best = 0;
    long long res = 0;
    cnt = 0;
    k = _k;
    for (int i = 0; i < 666013; ++i)
        f[i] = 0;
    for (int i = 1; i <= n; ++i) {
        if (ptr < i) {
            ++ptr;
            cnt = 1;
            f[x[ptr]] = 1;
        }
        while (good(ptr + 1))
            ++ptr;
        --f[x[i]];
        if (f[x[i]] == 0)
            --cnt;
        res += ptr - i + 1;
    }
    return res;
}

int main() {
    freopen("secv5.in", "r", stdin);
    freopen("secv5.out", "w", stdout);

    int p, u;
    scanf("%d%d%d", &n, &p, &u);
    for (int i = 1; i <= n; ++i) {
        scanf("%d", &x[i]);
        x[i] = ((long long)5 * x[i]) % 666013;
    }
    printf("%lld", solve(n, u) - solve(n, p - 1));
    return 0;
}