Cod sursa(job #2877482)

Utilizator Mihai145Oprea Mihai Adrian Mihai145 Data 24 martie 2022 19:42:57
Problema Secventa 5 Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.07 kb
#include <fstream>
#include <cassert>
#include <algorithm>

using namespace std;

const int NMAX = 1 << 21;

ifstream cin("secv5.in");
ofstream cout("secv5.out");

int N, L, U;
unsigned int v[NMAX + 2], v2[NMAX + 2];
int ct[NMAX + 2];
int l1 = 1, r1, l2 = 1, r2;
unsigned int d1[NMAX + 2], d2[NMAX + 2];
int vf1[NMAX + 2], vf2[NMAX + 2];
int count1, count2;

int main() {
    cin >> N >> L >> U;
    for (int i = 1; i <= N; ++i) {
        cin >> v[i];
        v2[i] = v[i];
    }

    sort(v2 + 1, v2 + N + 1);
    for(int i = 1; i <= N; i++) {
        if(v2[i] > v2[i - 1]) {
            ct[i - 1] = ct[i] + 1;
        } else {
            ct[i - 1] = ct[i];
        }
    }
    for(int i = 1; i <= N; i++) {
        int l = 1, r = N;
        while(l <= r) {
            int mid = (l + r) >> 1;
            if(v2[mid] == v[i]) {
                v[i] = ct[mid];
                break;
            } else if(v2[mid] > v[i]) {
                l = mid + 1;
            } else {
                r = mid - 1;
            }
        }

        assert(v[i] <= N);
    }

    long long sol = 0;

    for (int i = 1; i <= N; ++i) {
        if (vf1[v[i]] == 0) {
            count1++;
        }
        vf1[v[i]]++;
        d1[++r1] = i;

        if (vf2[v[i]] == 0) {
            count2++;
        }
        vf2[v[i]]++;
        d2[++r2] = i;

        while (count1 > U) {
            if (vf1[v[d1[l1]]] == 1) {
                count1--;
            }
            vf1[v[d1[l1]]]--;
            l1++;
        }

        int last = -1;
        while (count2 >= L) {
            last = d2[l2];
            if (vf2[v[d2[l2]]] == 1) {
                count2--;
            }
            vf2[v[d2[l2]]]--;
            l2++;
        }

        if (last != -1) {
            if (vf2[v[last]] == 0) {
                count2++;
            }
            vf2[v[last]]++;
            d2[--l2] = last;
        }

        if (count2 >= L) {
            sol += (d2[l2] - d1[l1] + 1);
        }
    }
    cout << sol << '\n';

    return 0;
}