Submission #546832

#TimeUsernameProblemLanguageResultExecution timeMemory
546832lovrotDreaming (IOI13_dreaming)C++11
100 / 100
190 ms19812 KiB
#include <bits/stdc++.h>
#include "dreaming.h"
 
#define X first
#define Y second
#define pii pair<int, int> 
#define pb push_back
 
using namespace std;
 
const int MN = 100010;
const int INF = 2 * 1e9 + 10;


int n, m, l, ret;
int min_max[MN], c[MN];
int nxt[MN], maxp[MN], h[MN], nxte[MN];
 
bool mark[MN], bio[MN];
 
vector<pii> g[MN], v;
vector<int> used; 
set<int> s;

bool comp(pii a, pii b){
	return a.Y > b.Y;	
}

int Find(int x){ 
	if(h[x] == x)
		return x;
	return h[x] = Find(h[x]);
}
 
void Union(int x, int y){ 
	h[x] = Find(y);
}
 
void use(int x){ 
	if(!mark[x]){ 
		used.pb(x);
		mark[x] = true;
	}
}
 
int maxPath(int x){
	use(x);
	bio[x] = true;
	maxp[x] = 0;
	int mi = x;
	for(pair<int, int> e : g[x]){
		int y = e.X;
		if(bio[y])
			continue;
 
		int val = e.Y; 
		int f = maxPath(y);
		if(maxp[y] + val > maxp[x]){ 
			maxp[x] = maxp[y] + val;
			mi = f;
			nxt[x] = y;
			nxte[x] = val;
		}
	}
 
	return mi;
}
 
void clearUsed(){ 
	for(int x : used){
		nxt[x] = 0;
		maxp[x] = 0;
		mark[x] = false;
		bio[x] = 0;
		nxte[x] = 0;
	}
	used.clear();
}
 
pii findCenter(int x, bool printp){ 
	clearUsed();
	x = maxPath(x);	
	clearUsed();
	int y = maxPath(x);
 
	int p = maxp[x]; 
	ret = max(ret, p);
 	int zb = 0;
 
 	if(printp){ 
 		return {p, 0};
 	}
 
	int mn = p, mni = x; 
	while(x != y){ 
		if(mn > max(zb, p - zb)){ 
			mn = max(zb, p - zb);
			mni = x;
		}	
		zb += nxte[x]; 
		x = nxt[x];
	}
 
	if(mn == INF)
		mn = 0;
 
	return {mni, mn};
}
 
int travelTime(int N, int M, int L, int A[], int B[], int T[]){
	ios_base::sync_with_stdio(false);
	
	for(int i = 0; i < MN; i++){
		h[i] = i;
		c[i] = i;
	}
 
	n = N;
 	m = M;
 	l = L;
 
	for(int i = 0; i < n; i++)
		s.insert(i);
 
	for(int i = 0; i < m; i++){ 
		int a, b, t;
		a = A[i];
 		b = B[i]; 
 		t = T[i];
 
		g[a].push_back({b, t});
		g[b].push_back({a, t});
		a = Find(a);
		b = Find(b);
		
		s.erase(a);
		s.erase(b);
		Union(a, b);
		s.insert(Find(a));
	}
 	
	auto it = s.begin();
	while(it != s.end()){ 
		pii res = findCenter(*it, 0);
		
		v.pb(res);

		it++;
	}
 	
 	sort(v.begin(), v.end(), comp);

	if(v.size() > 1)
		ret = max(ret, v[0].Y + v[1].Y + l);
	if(v.size() > 2)
		ret = max(ret, v[1].Y + v[2].Y + l * 2);
	return ret;
}
/*
int main(){ 
	int n, m, l;
	int a[MN], b[MN], t[MN]; 

	cin >> n >> m >> l;

	for(int i = 0; i < m; i++)
		cin >> a[i] >> b[i] >> t[i];

	cout << travelTime(n, m, l, a, b, t) << "\n";
	return 0;
}*/
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...