답안 #674916

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
674916 2022-12-26T14:51:11 Z QwertyPi Roadside Advertisements (NOI17_roadsideadverts) C++14
7 / 100
97 ms 11216 KB
#include <bits/stdc++.h>
#define pii pair<int, int>
#define fi first
#define se second
using namespace std;

const int MAXN = 5e4 + 11;
vector<pii> G[MAXN];
int tin[MAXN], tout[MAXN], timer;
int p[MAXN], d[MAXN], w[MAXN], anc[MAXN][20], dep[MAXN];
void dfs_prec(int v, int pa = -1){
	tin[v] = ++timer;
	for(auto i : G[v]){
		int u = i.fi, _w = i.se;
		if(u != pa){
			w[u] = _w; d[u] = d[v] + w[u]; dep[u] = dep[v] + 1; anc[u][0] = p[u] = v;
			for(int j = 1; j < 20; j++) anc[u][j] = anc[anc[u][j - 1]][j - 1];
			dfs_prec(u, v);
		}
	}
	tout[v] = timer;
}

int kth_anc(int u, int k){
	for(int j = 19; j >= 0; j--){
		if(k >= (1 << j)) u = anc[u][j], k -= (1 << j);
	}
	return u;
}

int lca(int u, int v){
	if(dep[u] < dep[v]) swap(u, v);
	u = kth_anc(u, dep[u] - dep[v]);
	for(int j = 19; j >= 0; j--){
		if(anc[u][j] != anc[v][j]){
			u = anc[u][j], v = anc[v][j];
		}
	}
	return u == v ? u : p[u];
}

bool is_anc(int u, int v){
	return tin[u] <= tin[v] && tout[v] >= tout[u];
}

int32_t main(){
	int n; cin >> n;
	for(int i = 0; i < n - 1; i++){
		int u, v, w; cin >> u >> v >> w;
		G[u].push_back({v, w});
		G[v].push_back({u, w});
	}
	dfs_prec(0);
	int q; cin >> q;
	for(int i = 0; i < q; i++){
		vector<int> v;
		for(int j = 0; j < 5; j++){
			int val; cin >> val; v.push_back(val);
		}
		sort(v.begin(), v.end(), [](int a, int b){
			return tin[a] < tin[b];
		});
		vector<int> path; path.push_back(v[0]);
		int ans = 0;
		for(int i = 1; i < v.size(); i++){
			while(path.size() >= 2 && is_anc(lca(path.back(), v[i]), path[path.size() - 2])){
				ans += d[path.back()] - d[path[path.size() - 2]];
				path.pop_back();
			}
			if(is_anc(path.back(), v[i])){
				path.push_back(v[i]);
			}else{
				int l = lca(path.back(), v[i]);
				ans += d[path.back()] - d[l];
				path.pop_back();
				path.push_back(l);
				path.push_back(v[i]);
			}
		}
		while(path.size() >= 2){
			ans += d[path.back()] - d[path[path.size() - 2]];
			path.pop_back();
		}
		cout << ans << endl;
	}
}

Compilation message

roadsideadverts.cpp: In function 'int32_t main()':
roadsideadverts.cpp:65:20: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   65 |   for(int i = 1; i < v.size(); i++){
      |                  ~~^~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 1492 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Incorrect 97 ms 11216 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 57 ms 9108 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 1492 KB Output is correct
2 Incorrect 97 ms 11216 KB Output isn't correct
3 Halted 0 ms 0 KB -