Cod sursa(job #483175)

Utilizator Addy.Adrian Draghici Addy. Data 7 septembrie 2010 10:14:04
Problema Secventa 5 Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.42 kb
#include <cstdio>
#include <vector>

using namespace std;

const int NMAX = 1050000;
const int MOD = 997037;

struct nod {
	unsigned int v; int nr;
	nod *next;
} *HASH1[MOD + 50], *HASH2[MOD + 50];

char buffer[NMAX * 10];
int MIN[NMAX], MAX[NMAX], n, dmin, dmax, d;
unsigned int A[NMAX];

void citire (), calcul (), adauga (nod*&, unsigned int), sterge (nod*&, unsigned int), afisare ();

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

void citire () {
	
	freopen ("secv5.in", "r", stdin);
	
	int i, j;
	unsigned int x;
	
	fread (buffer, sizeof (buffer), 1, stdin);
	
	i = 0;
	for (x = 0; buffer[i] >= '0' && buffer[i] <= '9'; i++)
		x = x * 10 + (buffer[i] - '0');
	n = (int) x;
	
	i++;
	for (x = 0; buffer[i] >= '0' && buffer[i] <= '9'; i++)
		x = x * 10 + (buffer[i] - '0');
	dmin = (int) x;
	
	i++;
	for (x = 0; buffer[i] >= '0' && buffer[i] <= '9'; i++)
		x = x * 10 + (buffer[i] - '0');
	dmax = (int) x;
	
	for (j = 1; j <= n; j++) {
		x = 0, i++;
		while (buffer[i] >= '0' && buffer[i] <= '9')
			x = x * 10 + (buffer[i++] - '0');
		A[j] = x;
	}
}

void calcul () {
	
	int p, u;
	
	p = 1, u = 0;
	
	while (p <= n && u < n) {
		u++;
		adauga (HASH1[A[u] % MOD], A[u]);
		
		while (d > dmax) {
			sterge (HASH1[A[p] % MOD], A[p]);
			p++;
		}
		
		MAX[u] = p;
	}
	
	p = n, u = n, d = 0;
	
	while (p >= 0 && u > 0) {
		
		if (p == 0 && d >= dmin)
			MIN[u] = 1;
		else if (p == 0)
			break;
		
		while (d < dmin) {
			adauga (HASH2[A[p] % MOD], A[p]);
			p--;
		}
		
		MIN[u] = p + 1;
		
		sterge (HASH2[A[u] % MOD], A[u]);
		u--;
	}
}

void adauga (nod *&H, unsigned int x) {
	
	nod *p;
	
	for (p = H; p != NULL; p = p -> next)
		if (p -> v == x) {
			p -> nr++;
			return;
		}
	
	p = new nod; d++;
	p -> v = x, p -> nr = 1, p -> next = H;
	H = p;
}

void sterge (nod *&H, unsigned int x) {
	
	nod *p, *aux;
	
	for (p = H; p != NULL; p = p -> next)
		if (p -> v == x) {
			p -> nr--;
			
			if (p -> nr == 0) {
				if (p == H) {
					aux = H, H = H -> next;
					delete aux;
				}
				else {
					aux = p, p = p -> next;
					delete aux;
				}
				
				d--;
			}
			
			return;
		}
}

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