Cod sursa(job #3142217)

Utilizator chiriacandrei25Chiriac Andrei chiriacandrei25 Data 20 iulie 2023 10:48:12
Problema Secventa 5 Scor 20
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.37 kb
#include <fstream>
#include <unordered_map>

using namespace std;

const int Nmax = (1 << 20) + 1;

unsigned int a[Nmax], L, U, n;
unordered_map<unsigned int, int> fr1, fr2;

int main() {
    ifstream fin("secv5.in");
    ofstream fout("secv5.out");
    fin >> n >> L >> U;
    for(int i = 1; i <= n; i++) {
        fin >> a[i];
    }
    // Secventa a[i1...j] trb sa aibe maxim U valori distincte
    // Secventa a[i2...j] trb sa aibe minim L valori distincte
    int i1 = 1, i2 = 1, cnt1 = 0, cnt2 = 0;
    long long sol = 0;
    for(int j = 1; j <= n; j++) {
        // Adaugam a[j] la fr1
        fr1[a[j]]++;
        if(fr1[a[j]] == 1) {
            cnt1++;
        }

        // Adaugam a[j] la fr2
        fr2[a[j]]++;
        if(fr2[a[j]] == 1) {
            cnt2++;
        }

        while(cnt1 > U) {
            // Scot a[i1] din fr1
            fr1[a[i1]]--;
            if(fr1[a[i1]] == 0) {
                cnt1--;
            }
            i1++;
        }

        while(cnt2 >= L) {
            // Scot a[i2] din fr2
            fr2[a[i2]]--;
            if(fr2[a[i2]] == 0) {
                cnt2--;
            }
            i2++;
        }

        i2--;
        fr2[a[i2]]++;
        if(fr2[a[i2]] == 1) {
            cnt2++;
        }

        sol += i2 - i1 + 1;
    }

    fout << sol << "\n";

    return 0;
}