답안 #769650

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
769650 2023-06-30T00:37:17 Z horiiseun Roadside Advertisements (NOI17_roadsideadverts) C++17
100 / 100
47 ms 12580 KB
#include <iostream>
#include <vector>
#include <tuple>
#include <queue>
#include <stack>
#include <deque>
#include <set>
#include <map>
#include <cmath>
#include <random>
#include <string>
#include <cassert>
#include <climits>
#include <algorithm>
#include <unordered_set>
#include <unordered_map>
using namespace std;

#define ll long long
#define f first
#define s second

void __print(int x) { cerr << x; }
void __print(long x) { cerr << x; }
void __print(long long x) { cerr << x; }
void __print(unsigned x) { cerr << x; }
void __print(unsigned long x) { cerr << x; }
void __print(unsigned long long x) { cerr << x; }
void __print(float x) { cerr << x; }
void __print(double x) { cerr << x; }
void __print(long double x) { cerr << x; }
void __print(char x) { cerr << '\'' << x << '\''; }
void __print(const char *x) { cerr << '\"' << x << '\"'; }
void __print(const string &x) { cerr << '\"' << x << '\"'; }
void __print(bool x) { cerr << (x ? "true" : "false"); }

template<typename A> void __print(const A &x);
template<typename A, typename B> void __print(const pair<A, B> &p);
template<typename... A> void __print(const tuple<A...> &t);
template<typename T> void __print(stack<T> s);
template<typename T> void __print(queue<T> q);
template<typename T, typename... U> void __print(priority_queue<T, U...> q);

template<typename A> void __print(const A &x) {
    bool first = true;
    cerr << '{';
    for (const auto &i : x) {
        cerr << (first ? "" : ","), __print(i);
        first = false;
    }
    cerr << '}';
}

template<typename A, typename B> void __print(const pair<A, B> &p) {
    cerr << '(';
    __print(p.f);
    cerr << ',';
    __print(p.s);
    cerr << ')';
}

template<typename... A> void __print(const tuple<A...> &t) {
    bool first = true;
    cerr << '(';
    apply([&first] (const auto &...args) { ((cerr << (first ? "" : ","), __print(args), first = false), ...); }, t);
    cerr << ')';
}

template<typename T> void __print(stack<T> s) {
    vector<T> debugVector;
    while (!s.empty()) {
        T t = s.top();
        debugVector.push_back(t);
        s.pop();
    }
    reverse(debugVector.begin(), debugVector.end());
    __print(debugVector);
}

template<typename T> void __print(queue<T> q) {
    vector<T> debugVector;
    while (!q.empty()) {
        T t = q.front();
        debugVector.push_back(t);
        q.pop();
    }
    __print(debugVector);
}

template<typename T, typename... U> void __print(priority_queue<T, U...> q) {
    vector<T> debugVector;
    while (!q.empty()) {
        T t = q.top();
        debugVector.push_back(t);
        q.pop();
    }
    __print(debugVector);
}

void _print() { cerr << "]\n"; }

template <typename Head, typename... Tail> void _print(const Head &H, const Tail &...T) {
    __print(H);
    if (sizeof...(T)) cerr << ", ";
    _print(T...);
}

#ifdef DEBUG
	#define D(...) cerr << "Line: " << __LINE__ << " [" << #__VA_ARGS__ << "] = ["; _print(__VA_ARGS__)
#else
	#define D(...)
#endif

int v, q, dist[50005], depth[50005], par[50005][20], in[50005], idx, ans;
bool seen[50005];
vector<pair<int, int>> adj[50005];

void dfs(int curr, int p) {
	in[curr] = idx++;
	for (auto [i, d] : adj[curr]) {
		if (i == p) continue;
		dist[i] = dist[curr] + d;
		depth[i] = depth[curr] + 1;
		par[i][0] = curr;
		dfs(i, curr);
	}
}

int lca(int x, int y) {
	if (depth[x] < depth[y]) swap(x, y);
	for (int i = 19; i >= 0; i--) {
		if (depth[x] - depth[y] >= 1 << i) {
			x = par[x][i];
		}
	}
	if (x == y) return x;
	for (int i = 19; i >= 0; i--) {
		if (par[x][i] != par[y][i]) {
			x = par[x][i];
			y = par[y][i];
		}
	}
	return par[x][0];
}

int main() {

	ios_base::sync_with_stdio(false);
	cin.tie(0);

	cin >> v;
	for (int i = 0, a, b, d; i < v - 1; i++) {
		cin >> a >> b >> d;
		adj[a].push_back({b, d});
		adj[b].push_back({a, d});
	}

	dfs(0, -1);

	for (int i = 1; i < 20; i++) {
		for (int j = 0; j < v; j++) {
			par[j][i] = par[par[j][i - 1]][i - 1];
		}
	}

	cin >> q;
	while (q--) {
		vector<pair<int, int>> lm;
		for (int i = 0, x; i < 5; i++) {
			cin >> x;
			lm.push_back({in[x], x});
		}
		sort(lm.begin(), lm.end());
		D(lm);
		ans = 0;
		for (int i = 0, c1, c2, l; i < 5; i++) {
			c1 = lm[i].s;
			c2 = lm[(i + 1) % 5].s;
			l = lca(c1, c2);
			ans += (dist[c1] + dist[c2] - 2 * dist[l]);
		}
		cout << ans / 2 << "\n";
	} 

}
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 1492 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 34 ms 10728 KB Output is correct
2 Correct 36 ms 12524 KB Output is correct
3 Correct 35 ms 12488 KB Output is correct
4 Correct 38 ms 12508 KB Output is correct
5 Correct 34 ms 12528 KB Output is correct
6 Correct 37 ms 12516 KB Output is correct
7 Correct 36 ms 12532 KB Output is correct
8 Correct 36 ms 12580 KB Output is correct
9 Correct 34 ms 12492 KB Output is correct
10 Correct 34 ms 12500 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 18 ms 8612 KB Output is correct
2 Correct 20 ms 11572 KB Output is correct
3 Correct 21 ms 11564 KB Output is correct
4 Correct 22 ms 11504 KB Output is correct
5 Correct 21 ms 11608 KB Output is correct
6 Correct 21 ms 11528 KB Output is correct
7 Correct 26 ms 11596 KB Output is correct
8 Correct 27 ms 11568 KB Output is correct
9 Correct 21 ms 11524 KB Output is correct
10 Correct 20 ms 11608 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 1492 KB Output is correct
2 Correct 34 ms 10728 KB Output is correct
3 Correct 36 ms 12524 KB Output is correct
4 Correct 35 ms 12488 KB Output is correct
5 Correct 38 ms 12508 KB Output is correct
6 Correct 34 ms 12528 KB Output is correct
7 Correct 37 ms 12516 KB Output is correct
8 Correct 36 ms 12532 KB Output is correct
9 Correct 36 ms 12580 KB Output is correct
10 Correct 34 ms 12492 KB Output is correct
11 Correct 34 ms 12500 KB Output is correct
12 Correct 18 ms 8612 KB Output is correct
13 Correct 20 ms 11572 KB Output is correct
14 Correct 21 ms 11564 KB Output is correct
15 Correct 22 ms 11504 KB Output is correct
16 Correct 21 ms 11608 KB Output is correct
17 Correct 21 ms 11528 KB Output is correct
18 Correct 26 ms 11596 KB Output is correct
19 Correct 27 ms 11568 KB Output is correct
20 Correct 21 ms 11524 KB Output is correct
21 Correct 20 ms 11608 KB Output is correct
22 Correct 34 ms 10732 KB Output is correct
23 Correct 27 ms 8916 KB Output is correct
24 Correct 36 ms 11960 KB Output is correct
25 Correct 34 ms 11864 KB Output is correct
26 Correct 35 ms 11852 KB Output is correct
27 Correct 35 ms 11968 KB Output is correct
28 Correct 35 ms 11888 KB Output is correct
29 Correct 47 ms 11980 KB Output is correct
30 Correct 35 ms 11960 KB Output is correct
31 Correct 35 ms 11964 KB Output is correct