제출 #1182266

#제출 시각아이디문제언어결과실행 시간메모리
1182266NonozeDreaming (IOI13_dreaming)C++20
100 / 100
56 ms24392 KiB
#include "dreaming.h"
#include <bits/stdc++.h>
#define pb push_back
#define all(x) x.begin(), x.end()
#define rall(x) x.rbegin(), x.rend()
#define cmax(a, b) a=max(a, b)
#define cmin(a, b) a=min(a, b)
#define sz(x) (int)x.size()
#define fi first
#define se second
using namespace std;

int n, m, k, cur, mx=0;
vector<vector<pair<int, int>>> adj;
vector<int> dist;
vector<bool> vis;

int dfs(int u, int p=-1) {
	dist[u]=0;
	for (auto [v, w]: adj[u]) if (v!=p) {
		cmax(dist[u], dfs(v, u)+w);
	}
	return dist[u];
}

void dfs2(int u, int p=-1, int act=0) {
	if (dist[u]<cur) cur=dist[u];
	cmax(mx, dist[u]);
	vis[u]=1;
	vector<pair<int, int>> children; children.pb({act, -1});
	for (auto [v, w]: adj[u]) if (v!=p) {
		children.pb({dist[v]+w, v});
	}
	sort(rall(children));
	for (auto [v, w]: adj[u]) if (v!=p) {
		int best=children[0].fi; if (children[0].se==v) best=children[1].fi;
		cmax(dist[v], best+w);
		dfs2(v, u, best+w);
	}
}


int travelTime(int N, int M, int L, int A[], int B[], int T[]) {
	n=N, m=M, k=L;
	adj.resize(n), dist.resize(n, -1);
	for (int i=0; i<m; i++) {
		adj[A[i]].pb({B[i], T[i]});
		adj[B[i]].pb({A[i], T[i]});
	}
	for (int i=0; i<n; i++) {
		if (dist[i]==-1) dfs(i);
	}
	vis.resize(n);
	vector<int> vec;
	for (int i=0; i<n; i++) {
		if (!vis[i]) {
			cur=dist[i];
			dfs2(i);
			vec.pb(cur);
		}
	}
	sort(rall(vec));
	for (int i=1; i<sz(vec); i++) {
		int du=vec[i-1], dv=vec[i];
		cmax(mx, du+k+dv);
		cmax(vec[i-1], du+k), cmax(vec[i], dv+k);
		if (vec[i-1]<vec[i]) swap(vec[i], vec[i-1]);
	}
	return mx;
}
#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...