Cod sursa(job #586312)

Utilizator Addy.Adrian Draghici Addy. Data 30 aprilie 2011 14:28:06
Problema Guvern Scor 0
Compilator cpp Status done
Runda Algoritmiada 2011, Runda Finală, Clasele 10-12 Marime 1.93 kb
#include <cstdio>
#include <vector>
#include <list>
#include <set>

using namespace std;

#define NMAX 200050
#define MOD 100057

int D[NMAX], TO[NMAX], C[NMAX], fii[NMAX], viz[NMAX], n, i, sol;
vector <int> G[NMAX], V[NMAX];
list < pair <int, int> > H1[MOD], H2[MOD];
set <int> S;

void adauga (int x, int nod) {
	
	if (x >= 0) {
		int t = x % MOD;
		H1[t].push_back (make_pair (x, nod));
	}
	else {
		x = -x; int t = x % MOD;
		H2[t].push_back (make_pair (x, nod));
	}
}

void citire () {
	
	freopen ("guvern.in", "r", stdin);
	
	int i, x, y;
	
	scanf ("%d", &n);
	
	for (i = 1; i <= n; i++) {
		scanf ("%d %d", &x, &y);
		G[x].push_back (y);
		G[y].push_back (x);
	}
	
	for (i = 1; i <= n; i++) {
		scanf ("%d", &C[i]);
		adauga (C[i], i);
	}
}

int cauta1 (int x) {
	
	int t = x % MOD;
	for (list < pair <int, int> >::iterator it = H1[t].begin (); it != H1[t].end (); it++)
		if (it -> first == x) return it -> second;
	
	return 0;
}

int cauta2 (int x) {
	
	x = -x;	int t = x % MOD;
	for (list < pair <int, int> >::iterator it = H2[t].begin (); it != H2[t].end (); it++)
		if (it -> first == x) return it -> second;
	
	return 0;
}

void dfs1 (int nod) {
	
	int x;
	
	set <int>::iterator it2 = S.lower_bound (C[nod]);
	if (C[nod] >= 0) x = cauta1 (*it2);
	else x = cauta2 (*it2);
	
	TO[nod] = x; D[x]++;
	V[x].push_back (nod);
	
	viz[nod] = 1; S.insert (C[nod]);
	for (vector <int>::iterator it = G[nod].begin (); it != G[nod].end (); it++)
		if (!viz[*it]) dfs1 (*it);
	
	it2 = S.find (C[nod]); S.erase (it2);
}

void dfs2 (int nod) {
	
	viz[nod] = 1; fii[nod] = 1;
	for (vector <int>::iterator it = V[nod].begin (); it != V[nod].end (); it++)
		if (!viz[*it]) {
			dfs1 (*it);
			fii[nod] += fii[*it];
		}
}

int main () {
	
	citire ();
	
	dfs1 (1);
	
	for (i = 1; i <= n; i++) {
		dfs2 (i);
		if (fii[i] > sol) sol = fii[i];
	}
	
	printf ("%d", sol);
	
	return 0;
}