Cod sursa(job #2877084)

Utilizator dimi999Dimitriu Andrei dimi999 Data 24 martie 2022 09:24:21
Problema Secventa 5 Scor 80
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.46 kb
#include <fstream>
#include <vector>
#include <unordered_map>
#pragma GCC optimize("O3,unroll-loops")
#pragma GCC target("avx2,bmi,bmi2,lzcnt,popcnt")
using namespace std;

vector <unsigned int> v;
unordered_map <unsigned int, unsigned int> fvst, fvdr;

class InParser {
private:
    FILE *fin;
    char *buff;
    int sp;

    char read_ch() {
        ++sp;
        if (sp == 4096) {
            sp = 0;
            fread(buff, 1, 4096, fin);
        }
        return buff[sp];
    }

public:
    InParser(const char* nume) {
        fin = fopen(nume, "r");
        buff = new char[4096]();
        sp = 4095;
    }

    InParser& operator >> (int &n) {
        char c;
        while (!isdigit(c = read_ch()) && c != '-');
        int sgn = 1;
        if (c == '-') {
            n = 0;
            sgn = -1;
        } else {
            n = c - '0';
        }
        while (isdigit(c = read_ch())) {
            n = 10 * n + c - '0';
        }
        n *= sgn;
        return *this;
    }

    InParser& operator >> (unsigned int &n) {
        char c;
//        while (!isdigit(c = read_ch()) && c != '-');
        int sgn = 1;
//        if (c == '-') {
//            n = 0;
//            sgn = -1;
//        } else {
//            n = c - '0';
//        }
        n = 0;
        while (isdigit(c = read_ch())) {
            n = 10 * n + c - '0';
        }
        n *= sgn;
        return *this;
    }

    InParser& operator >> (long long &n) {
        char c;
        n = 0;
        while (!isdigit(c = read_ch()) && c != '-');
        long long sgn = 1;
        if (c == '-') {
            n = 0;
            sgn = -1;
        } else {
            n = c - '0';
        }
        while (isdigit(c = read_ch())) {
            n = 10 * n + c - '0';
        }
        n *= sgn;
        return *this;
    }
};

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


int main() {
    unsigned int N, L, U;

    fin >> N >> L >> U;

    for(unsigned int i = 1; i <= N; i++) {
        unsigned int x; fin >> x; v.push_back(x);
    }
    unsigned int poz = 0, st = 0, dr = 0;

    while(fvst.size() < L && poz < N) {
        fvst[v[poz]]++;
        fvdr[v[poz]]++;
        poz++;
    }

    if(poz == N) {
        if(fvst.size() < L) {
            fout << 0 << '\n';
            return 0;
        }
    }

    st = poz - 1;

    while(fvdr.size() <= U && poz < N) {
        fvdr[v[poz++]]++;
    }

    if(fvdr.size() <= U)
        dr = poz - 1;
    else {
        dr = poz - 2;
        fvdr[v[poz - 1]]--;
        if(fvdr[v[poz - 1]] == 0) {
            fvdr.erase(v[poz - 1]);
        }
    }


    long long ans = dr - st + 1;

    poz = 1;
    while(poz < N) {
        fvst[v[poz - 1]]--;
        fvdr[v[poz - 1]]--;

        if(fvst[v[poz - 1]] == 0) {
            fvst.erase(v[poz - 1]);
        }

        if(fvdr[v[poz - 1]] == 0) {
            fvdr.erase(v[poz - 1]);
        }

        while(fvst.size() < L && st < N - 1) {
            fvst[v[++st]]++;
        }

        if(st == N - 1 && fvst.size() < L)
            break;

        while(fvdr.size() <= U && dr < N - 1) {
            fvdr[v[++dr]]++;
        }
        if(fvdr.size() > U) {
            fvdr[v[dr]]--;
            if(fvdr[v[dr]] == 0) {
                fvdr.erase(v[dr]);
            }
            dr--;
        }

        ans += dr - st + 1;
        poz++;
    }

    fout << ans;
    return 0;
}