Cod sursa(job #2877044)

Utilizator Mihai145Oprea Mihai Adrian Mihai145 Data 24 martie 2022 08:55:47
Problema Secventa 5 Scor 80
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.08 kb
//
// Created by Mihai145 on 3/24/2022.
//

#include <fstream>

#include <vector>
#include <deque>
#include <unordered_map>

void push_val_back(std::deque<int> &d, std::unordered_map<unsigned int, int> &m, int &count_dist, std::vector<unsigned int> &v,
                   const int &pos) {
    d.push_back(pos);

    if (m[v[pos]] == 0) {
        count_dist++;
    }
    m[v[pos]]++;
}

void push_val_front(std::deque<int> &d, std::unordered_map<unsigned int, int> &m, int &count_dist, const std::vector<unsigned int> &v,
                    const int &pos) {
    d.push_front(pos);

    if (m[v[pos]] == 0) {
        count_dist++;
    }
    m[v[pos]]++;
}

int pop_val(std::deque<int> &d, std::unordered_map<unsigned int, int> &m, int &count_dist, const std::vector<unsigned int> &v) {
    if (m[v[d.front()]] == 1) {
        count_dist--;
    }
    m[v[d.front()]]--;

    int r = d.front();
    d.pop_front();

    return r;
}

int main() {
    std::ifstream cin("secv5.in");
    std::ofstream cout("secv5.out");

    int N, L, U;
    cin >> N >> L >> U;

    std::vector<unsigned int> v(N + 1, 0);
    for (int i = 1; i <= N; ++i) {
        cin >> v[i];
    }

    std::deque<int> dq_l_max, dq_l_min;
    std::unordered_map<unsigned int, int> freq_l_max, freq_l_min;
    int count_dist_max = 0, count_dist_min = 0;

    long long sol = 0;
    for (int i = 1; i <= N; ++i) {
        push_val_back(dq_l_max, freq_l_max, count_dist_max, v, i);
        push_val_back(dq_l_min, freq_l_min, count_dist_min, v, i);

        while (count_dist_max > U) {
            pop_val(dq_l_max, freq_l_max, count_dist_max, v);
        }

        int last_popped = -1;
        while (count_dist_min >= L) {
            last_popped = pop_val(dq_l_min, freq_l_min, count_dist_min, v);
        }
        if (last_popped != -1) {
            push_val_front(dq_l_min, freq_l_min, count_dist_min, v, last_popped);
        }

        if (count_dist_min >= L) {
            sol += (dq_l_min.front() - dq_l_max.front() + 1);
        }
    }
    cout << sol;

    return 0;
}