Cod sursa(job #2439679)

Utilizator DavidLDavid Lauran DavidL Data 16 iulie 2019 17:17:56
Problema Secventa 5 Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.39 kb
#include <bits/stdc++.h>
#define int long long
using namespace std;/*
#define cin fi
#define cout fo
ifstream fi("secv5.in");
ofstream fo("secv5.out");*/

const int NMAX = 1100000;

int n, l, u;
int x[NMAX], y[NMAX];
map <int, int> M;
int k;
int dp[NMAX], f[NMAX];

void normalizare()
{
    for (int i = 1; i <= n; i++)
        y[i] = x[i];

    sort(y + 1, y + n + 1);

    for (int i = 1; i <= n; i++)
        if (y[i] != y[i - 1])
            M[y[i]] = ++k;

    for (int i = 1; i <= n; i++)
        x[i] = M[x[i]];
}

long long nrSubsecventeMaximXDistincte(int nr)
{
    if (nr == 0)
        return 0;

    memset(dp, 0, sizeof(dp));
    memset(f, 0, sizeof(f));

    int total = 0;
    dp[1] = 1;
    f[x[1]] = 1;
    total++;

    for (int i = 2; i <= n; i++)
    {
        if (!f[x[i]])
            total++;
        f[x[i]]++;

        dp[i] = dp[i - 1];
        while (total > nr)
        {
            f[x[dp[i]]]--;
            if (!f[x[dp[i]]])
                total--;

            dp[i]++;
        }
    }

    long long ret = 0;
    for (int i = 1; i <= n; i++)
        ret += i - dp[i] + 1;

    return ret;
}

signed main()
{
    cin >> n >> l >> u;
    for (int i = 1; i <= n; i++)
        cin >> x[i];

    normalizare();

    cout << nrSubsecventeMaximXDistincte(u) - nrSubsecventeMaximXDistincte(l - 1);

    return 0;
}