Submission #1268629

#TimeUsernameProblemLanguageResultExecution timeMemory
1268629cmiucDreaming (IOI13_dreaming)C++20
0 / 100
28 ms11840 KiB
#include <iostream>
#include <vector>
#include "dreaming.h"

using namespace std;
const int N = 1e5 + 10;
vector<pair<int,int>> nei[N];
int Mx[N][4], Min;

void dfs2(int u, int p){
	for (auto [i, w] : nei[u]){
		if (i == p)
			continue;
		if (Mx[i][1] + w == Mx[u][1])
			Mx[i][3] = max(Mx[u][3], Mx[u][2]) + w;
		else
			Mx[i][3] = max(Mx[u][3], Mx[u][1]) + w;
		dfs2(i, u);
	}
	Min = min(Min, max(Mx[u][3], Mx[u][1]));
}

void dfs1(int u, int p){
	for (auto [i, w] : nei[u]){
		if (i == p)
			continue;
		dfs1(i, u);
		if (Mx[i][1] + w > Mx[u][1])
			Mx[u][2] = Mx[u][1], Mx[u][1] = Mx[i][1] + w;
		else
			Mx[u][2] = max(Mx[u][2], Mx[i][1] + w);
	}
}

int travelTime(int n, int m, int l, int A[], int B[], int T[]){
	for (int i=0;i<m;i++){
		nei[B[i]].push_back({A[i], T[i]});
		nei[A[i]].push_back({B[i], T[i]});
	}

	int M1 = 0, M2 = 0, M3 = 0;
	for (int i=0;i<n;i++){
		if (Mx[i][1] or Mx[i][3])
			continue;
		Min = 1e9;
		dfs1(i, i);
		dfs2(i, i);
		if (Min > M1)
			M3 = M2, M2 = M1, M1 = Min;
		else if (Min > M2)
			M3 = M2, M2 = Min;
		else
			M3 = max(M3, Min);
	}

	if (m == n - 1)
		return M1;
	return max(M1 + M2 + l, M2 + M3 + l + l);
}
#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...