Submission #221811

#TimeUsernameProblemLanguageResultExecution timeMemory
221811patrikpavic2Dreaming (IOI13_dreaming)C++17
100 / 100
104 ms17528 KiB
/**
* user:  ppavic
* fname: Patrik
* lname: Pavić
* task:  dreaming
* score: 100.0
* date:  2019-06-27 09:30:59.412917
*/
#include "dreaming.h"
#include <cstdio>
#include <cstring>
#include <vector>
#include <algorithm>

#define X first
#define Y second
#define PB push_back

using namespace std;

typedef pair < int, int > pii;
typedef vector < int > vi;
typedef vector < pii > vp;

const int N = 1e5 + 500;
const int INF = 0x3f3f3f3f;

int d[N], u[N], dp[N], min_sol;
vp v[N];

void calc_d(int x,int lst){
	for(pii y : v[x]){
		if(y.X == lst) continue;
		calc_d(y.X, x);
		d[x] = max(d[y.X] + y.Y, d[x]);
	}
}

void calc(int x,int lst){
	int dos = u[x];
	for(pii y : v[x]){
		if(y.X == lst) continue;
		u[y.X] = max(u[y.X],y.Y + dos);
		dos = max(dos, d[y.X] + y.Y);
	}
	reverse(v[x].begin(), v[x].end());
	dos = 0;
	for(pii y : v[x]){
		if(y.X == lst) continue;
		u[y.X] = max(u[y.X],y.Y + dos);
		dos = max(dos, d[y.X] + y.Y);
	}
	reverse(v[x].begin(), v[x].end());
	dp[x] = min(max(u[x], d[x]), dp[x]);
	min_sol = max(min_sol, d[x] + u[x]);
	for(pii y : v[x]){
		if(y.X == lst) continue;
		calc(y.X, x);
		dp[x] = min(dp[x], dp[y.X]);
	}
}


int travelTime(int N, int M, int L, int A[], int B[], int T[]) {
	for(int i = 0;i < M;i++){
		v[A[i]].PB({B[i], T[i]});
		v[B[i]].PB({A[i], T[i]});
	}    
	memset(dp, INF, sizeof(dp));
	vi f;
	for(int i = 0;i < N;i++){
		if(dp[i] != INF) continue;
		calc_d(i, i); calc(i, i);
		f.PB(dp[i]);
	}
	sort(f.rbegin(), f.rend());
	if(f.size() == 1) return max(f[0], min_sol);
	else if(f.size() == 2) return max(f[0] + f[1] + L, min_sol);
	return max(max(f[0] + f[1] + L, f[1] + f[2] + 2 * L), min_sol);
}


#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...