Cod sursa(job #2038974)

Utilizator danyvsDan Castan danyvs Data 14 octombrie 2017 10:25:13
Problema Secventa 5 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.93 kb
#include <fstream>
#include <unordered_map>

using namespace std;

ifstream fin("secv5.in");
ofstream fout("secv5.out");

const int NMAX = 1024 * 1024 + 5;

unsigned int n, l, u, vec[NMAX];

void read() {
    fin >> n >> l >> u;
    for (int i = 1; i <= n; ++ i)
        fin >> vec[i];
}

long long cntSecv(int k) {
    // cate secvente au cel mult k valori distincte
    unordered_map<unsigned int, int> M;
    long long cnt = 0;
    int idx = 1;
    for (int i = 1; i <= n; ++ i) {
        ++ M[vec[i]];
        while ((int)M.size() > k) {
            int temp = vec[idx ++];
            -- M[temp];
            if (!M[temp])
                M.erase(temp);
        }
        cnt += (i - idx + 1); // adaug cele i - idx + 1 secvente care se termina cu vec[i]
    }
    return cnt;
}

int main() {
    read();
    fin.close();
    fout << cntSecv(u) - cntSecv(l - 1) << "\n";
    fout.close();
    return 0;
}