Cod sursa(job #1568288)

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

using namespace std;

unsigned x[1000010];
unordered_map <unsigned, int> f;

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;
    f.clear();
    for (int i = 1; i <= n; ++i) {
        if (ptr < i) {
            ++ptr;
            cnt = 1;
            f[x[ptr]] = 1;
        }
        while (good(ptr + 1))
            ++ptr;
        res += ptr - i + 1;
        while (cnt == k) {
            --f[x[i]];
            if (f[x[i]] == 0)
                --cnt;
        }
    }
    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("%u", &x[i]);

    printf("%lld", solve(n, u) - solve(n, p - 1));
    return 0;
}