Cod sursa(job #2608880)

Utilizator TimitocArdelean Andrei Timotei Timitoc Data 1 mai 2020 20:26:25
Problema Secventa 5 Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.3 kb
#include <fstream>
#include <cstdio>
#include <unordered_map>

using namespace std;

const int MAXN = 1050000;
unsigned int n, L, U;
unsigned int values[MAXN];

FILE *fin = fopen("secv5.in", "r");
int cursor = 0;
const int DIM = (1<<21);
char buf[DIM];

void adv()
{
    if (__builtin_expect(++cursor == DIM, 0)) {
        cursor = 0;
        fread(buf, DIM, 1, fin);
    }
}

void readUnsigned(unsigned int &nr)
{
    for (; buf[cursor] < '0'; adv());
    for (nr = 0; buf[cursor] >= '0' && buf[cursor] <= '9'; adv())
        nr = nr*10 + buf[cursor] - '0';
}

long long compute(unsigned int x)
{
    unordered_map<unsigned int, int> m;
    unsigned int st = 0;
    long long sol = 0;
    for (unsigned int dr = 0; dr < n; dr++) {
        ++m[values[dr]];
        while (m.size() > x) {
            auto it = m.find(values[st]);
            if (--(it->second) == 0)
                m.erase(it);
            ++st;
        }
        sol += dr - st +1;
    }
    return sol;
}

int main()
{
    ofstream fout("secv5.out");
    fread(buf, DIM, 1, fin);

    readUnsigned(n);
    readUnsigned(L);
    readUnsigned(U);
    for (unsigned int i = 0; i < n; i++)
        readUnsigned(values[i]);
    long long rez = compute(U) - compute(L-1);
    fout << rez;

    return 0;
}