제출 #71491

#제출 시각아이디문제언어결과실행 시간메모리
71491RezwanArefin01Race (IOI11_race)C++17
100 / 100
2109 ms114532 KiB
#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
typedef pair<int, int> ii; 

const int maxn = 2e5 + 10; 
vector<int> adj[maxn], cost[maxn]; 
ll dist[maxn]; bool vis[maxn]; 
int sub[maxn], len[maxn], n, k; 
int ans = 1e9; 

void calc(int u, int par) {
	sub[u] = 1;
	for(int v : adj[u]) if(v - par && !vis[v]) 
		calc(v, u), sub[u] += sub[v];
}

int centroid(int u, int par, int r) {
	for(int v : adj[u]) if(v - par && !vis[v]) 
		if(sub[v] > r) return centroid(v, u, r);
	return u;
}

vector<int> vert; int in[maxn], out[maxn];

void dfs(int u, int par) { 
	in[u] = vert.size(); vert.push_back(u);
	for(int i = 0; i < adj[u].size(); ++i) {
		int v = adj[u][i], c = cost[u][i];
		if(v == par || vis[v]) continue; 
		dist[v] = dist[u] + c; 
		len[v] = len[u] + 1;
		dfs(v, u); 
	} out[u] = vert.size() - 1;
}
void solve(int u) {
	dist[u] = len[u] = 0;
	vert.clear(); dfs(u, -1);

	unordered_map<ll, int> mp; mp[0] = 0;

	for(int v : adj[u]) if(!vis[v]) {
		for(int t = in[v]; t <= out[v]; ++t) {
			int w = vert[t];
			if(mp.count(k - dist[w])) 
				ans = min(ans, mp[k - dist[w]] + len[w]); 
		}
		for(int t = in[v]; t <= out[v]; ++t) {
			int w = vert[t];
			if(!mp.count(dist[w])) mp[dist[w]] = len[w];
			else mp[dist[w]] = min(mp[dist[w]], len[w]);
		}
	}

}
void decomp(int u, int par) {
	calc(u, -1); 
	int c = centroid(u, par, sub[u] / 2);
	solve(c); vis[c] = 1; 
	for(int v : adj[c]) if(!vis[v]) decomp(v, c);
}

int best_path(int N, int K, int H[][2], int L[]){
	n = N, k = K; 
	for(int i = 0; i < N - 1; i++) {
		adj[H[i][0]].push_back(H[i][1]); 
		adj[H[i][1]].push_back(H[i][0]); 
		cost[H[i][0]].push_back(L[i]);
		cost[H[i][1]].push_back(L[i]);
	}
	decomp(0, -1);	
	if(ans == 1e9) ans = -1;
	return ans;
}

컴파일 시 표준 에러 (stderr) 메시지

race.cpp: In function 'void dfs(int, int)':
race.cpp:29:19: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for(int i = 0; i < adj[u].size(); ++i) {
                 ~~^~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...