Cod sursa(job #2849061)

Utilizator mateitudordmDumitru Matei mateitudordm Data 14 februarie 2022 14:52:20
Problema Secventa 5 Scor 10
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.51 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;
    if (l == 1)
    {
        l++;
        for (i = 1; i <= n; i++)
            cnt += c[i] * (c[i] + 1) / 2;
    }
    for (i = 1; i <= n; i++)
        cpart[i] = cpart[i - 1] + c[i];
    cpart[n + 1] = cpart[n];
    st = 0, dr = 0;
    // fst[v[1]]++, fdr[v[1]]++;
    if (l <= u)
        for (i = 1; i <= n; i++)
        {
            while (st < n && fst.size() < l)
                fst[v[++st]]++;
            while (dr < n && fdr.size() < u)
                fdr[v[++dr]]++;
            // cout << st << " " << dr << " " << max(cpart[dr] - cpart[st - 1], 1LL) * c[i] << endl;
            if (fdr.size() >= l && fdr.size() <= u)
                if (dr != i)
                    cnt += max(cpart[dr] - cpart[st - 1], 1LL) * c[i];
                else
                    cnt += c[i] * (c[i] + 1) / 2;
            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;
}