Cod sursa(job #2608847)

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

using namespace std;

const int MAXN = (1<<20)+5;
unsigned int n, L, U;
unsigned int values[MAXN];

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

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

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

long long compute(int x)
{
    unordered_map<unsigned int, int> m;
    int st = 0;
    long long sol = 0;
    for (int dr = 0; dr < n; dr++) {
        ++m[values[dr]];
        while (m.size() > x) {
            if ((--m[values[st]]) == 0)
                m.erase(values[st]);
            ++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 (int i = 0; i < n; i++)
        readUnsigned(values[i]);
    long long rez = compute(U) - compute(L-1);
    fout << rez;

    return 0;
}