Cod sursa(job #1506386)

Utilizator tamionvTamio Vesa Nakajima tamionv Data 20 octombrie 2015 16:28:23
Problema Guvern Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.39 kb
#include <fstream>
#include <iostream>
#include <algorithm>
#include <set>
#include <vector>
#include <utility>
#include <tuple>
using namespace std;

constexpr int unvisited = -1;

template <typename Set_t>
void dfs(const int cur, const int prev, const vector<vector<int> >& graf,
	const vector<int>& coop, vector<vector<int> >& fortat_de, Set_t& parinti,
	vector<pair<int, int> >& st_fin, int& poz_euler, vector<int>& best_subarb,
	vector<int>& best_upto_begin){
	/*
	cout << cur << " - ";
	for(const auto x : parinti){
		cout << x << ' '; }
	cout << endl;
	*/

	if(!parinti.empty()){
		fortat_de[*parinti.lower_bound(cur)].push_back(cur); }

	st_fin[cur].first = poz_euler++;

	parinti.insert(cur);
	for(const auto next : graf[cur]){
		if(next != prev){
			dfs(next, cur, graf, coop, fortat_de, parinti, st_fin, poz_euler, best_subarb, best_upto_begin); } }
	parinti.erase(cur);

	st_fin[cur].second = poz_euler++;
	vector<pair<int, int>> evenimente;
	for(const auto x : fortat_de[cur]){
		evenimente.emplace_back(x, st_fin[x].first);
		evenimente.emplace_back(x, st_fin[x].second); }
	sort(begin(evenimente), end(evenimente),
		[](const pair<int, int>& a, const pair<int, int>& b){
			return a.second < b.second; });
	int best_here = 1;
	for(const auto x : evenimente){
		if(best_upto_begin[x.first] == unvisited){
			//echivalent cu x e un inceput
			best_upto_begin[x.first] = best_here; }
		else{
			best_here = max(best_upto_begin[x.first] + best_subarb[x.first],
				best_here); } }
	best_subarb[cur] = best_here; }

int main(){
	ifstream f("guvern.in");
	ofstream g("guvern.out");
	int n;
	f >> n;
	vector<vector<int> > graf(n+1);
	vector<int> coop(n+1, 1000000001);
	for(int i = 0, a, b; i < n-1; ++i){
		f >> a >> b;
		graf[a].push_back(b);
		graf[b].push_back(a); }
	graf[0].push_back(1);
	graf[1].push_back(0);
	for(int i = 1; i <= n; ++i){
		f >> coop[i]; }
	vector<vector<int> > fortat_de(n+1);
	auto cmp = [&coop](const int x, const int y){
		return coop[x] < coop[y]; };
	set<int, decltype(cmp)> parinti(cmp);
	vector<pair<int, int> > st_fin(n+1);
	int poz_euler = 0;
	vector<int> best_subarb(n+1, unvisited), best_upto_begin(n+1, unvisited);

	dfs(0, -1, graf, coop, fortat_de, parinti, st_fin, poz_euler, best_subarb, best_upto_begin);

	/*
	for(int i = 0; i <= n; ++i){
		cout << i << " - ";
		for(const auto x : fortat_de[i]){
			cout << x << ' '; }
		cout << endl; }
	cout << endl;
	*/

	g << best_subarb[0]-1;
	return 0; }