Cod sursa(job #2849055)

Utilizator mateitudordmDumitru Matei mateitudordm Data 14 februarie 2022 14:20:14
Problema Secventa 5 Scor 10
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.12 kb
#include <bits/stdc++.h>
#define nmax 1005000
#define int long long

using namespace std;

int v[nmax + 1], c[nmax + 1], cpart[nmax + 1];
map<int, int> fst, fdr;

signed main()
{
    ifstream cin("secv5.in");
    ofstream cout("secv5.out");
    int n, l, u, p = 0, a, i, st, dr, cnt = 0;
    cin >> n >> l >> u;
    for (i = 1; i <= n; i++)
    {
        cin >> a;
        if (a == v[p])
            c[p]++;
        else
            ++p, v[p] = a, c[p] = 1;
    }
    n = p;
    for (i = 1; i <= n; i++)
        cpart[i] = cpart[i - 1] + c[i];
    cpart[n + 1] = cpart[n];
    st = 1, dr = 1;
    // fst[v[1]]++, fdr[v[1]]++;
    for (i = 1; i <= n; i++)
    {
        while (st <= n && fst.size() < l)
            fst[v[st]]++, st++;
        while (dr <= n && fdr.size() < u)
            fdr[v[dr]]++, dr++;
        if (fdr.size() >= l && fdr.size() <= u)
            cnt += max(cpart[dr] - cpart[st - 2], 1LL) * c[i];
        fst[v[i]]--, fdr[v[i]]--;
        if (fst[v[i]] == 0)
            fst.erase(v[i]);
        if (fdr[v[i]] == 0)
            fdr.erase(v[i]);
    }
    cout << cnt;
    return 0;
}