Cod sursa(job #1312344)

Utilizator cernat.catallinFMI Cernat Catalin Stefan cernat.catallin Data 9 ianuarie 2015 12:39:54
Problema Secventa 5 Scor 100
Compilator cpp Status done
Runda Teme Pregatire ACM Unibuc 2014, Anul I Marime 0.83 kb
/*
 * Fie nr(a, b) numarul subsecventelor ce au intre a si b elemente distincte.
 * nr(l, u) = nr(1, u) - nr(1, l - 1).
 */
#include <stdio.h>
#include <unordered_map>
using namespace std;

typedef long long int64;
typedef unsigned int uint;
const int Nmax = (1 << 20) + 5;

uint n, l, u;
uint v[Nmax];
unordered_map<uint, uint> h;

int64 secv(uint x) {
	int64 result = 0;

	h.clear();
	for (uint st = 1, dr = 1; dr <= n; ++dr) {
		++h[ v[dr] ];
		while (h.size() > x) {
			--h[ v[st++] ];
			if (h[ v[st - 1] ] == 0)
				h.erase(v[st - 1]);
		}
		result += 1LL * (dr - st + 1);
	}

	return result;
}

int main() {
    freopen("secv5.in", "r", stdin);
    freopen("secv5.out", "w", stdout);

    scanf("%u %u %u", &n, &l, &u);
    for (uint i = 1; i <= n; ++i)
        scanf("%u", &v[i]);
	printf("%lld\n", secv(u) - secv(l - 1));

	return 0;
}