Cod sursa(job #483106)

Utilizator Addy.Adrian Draghici Addy. Data 6 septembrie 2010 22:20:23
Problema Secventa 5 Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.26 kb
#include <cstdio>
#include <vector>

using namespace std;

const int NMAX = 1050000;
const int MOD = 666013;

int A[NMAX], MIN[NMAX], MAX[NMAX], n, dmin, dmax, d;
vector < pair <int, int> > HASH1[MOD + 1], HASH2[MOD + 1];

void citire (), calcul (), adauga (int, int), sterge (int, int), afisare ();

int main () {
	
	citire ();
	
	calcul ();
	
	afisare ();
	
	return 0;
}

void citire () {
	
	freopen ("secv5.in", "r", stdin);
	
	char aux[32];
	int i, j, x;
	
	scanf ("%d %d %d\n", &n, &dmin, &dmax);
	
	for (i = 1; i <= n; i++) {
		scanf ("%s", aux);
		for (j = 0, x = 0; aux[j] >= '0' && aux[j] <= '9'; j++)
			x = x * 10 + (aux[j] - '0');
		A[i] = x;
	}
}

void calcul () {
	
	int p, u;
	
	p = 1, u = 0;
	
	while (p <= n && u <= n) {
		u++;
		adauga (A[u], 1);
		
		while (d > dmax) {
			sterge (A[p], 1);
			p++;
		}
		
		MAX[u] = p;
	}
	
	p = n, u = n, d = 0;
	
	while (p > 0 && u > 0) {
		
		while (d < dmin) {
			adauga (A[p], 2);
			p--;
		}
		
		MIN[u] = p + 1;
		
		sterge (A[u], 2);
		u--;
	}
}

void adauga (int x, int tip) {
	
	int p = x % MOD;
	vector < pair <int, int> >::iterator it;
	
	if (tip == 1) {
		for (it = HASH1[p].begin (); it != HASH1[p].end (); it++)
			if ((*it).first == x) {
				(*it).second++;
				return;
			}
		HASH1[p].push_back (make_pair (x, 1)), d++;
	}
	
	if (tip == 2) {
		for (it = HASH2[p].begin (); it != HASH2[p].end (); it++)
			if ((*it).first == x) {
				(*it).second++;
				return;
			}
		HASH2[p].push_back (make_pair (x, 1)), d++;
	}
}

void sterge (int x, int tip) {
	
	int p = x % MOD;
	vector < pair <int, int> >::iterator it;
	
	if (tip == 1)
		for (it = HASH1[p].begin (); it != HASH1[p].end (); it++)
			if ((*it).first == x) {
				(*it).second--;
				
				if ((*it).second == 0)
					HASH1[p].erase (it), d--;
				return;
			}
	
	if (tip == 2)
		for (it = HASH2[p].begin (); it != HASH2[p].end (); it++)
			if ((*it).first == x) {
				(*it).second--;
				
				if ((*it).second == 0)
					HASH2[p].erase (it), d--;
				return;
			}
}

void afisare () {
	
	freopen ("secv5.out", "w", stdout);
	
	int i, sol = 0;
	
	for (i = 1; i <= n; i++)
		if (MIN[i] >= MAX[i])
			sol += MIN[i] - MAX[i] + 1;
	
	printf ("%d", sol);
}