이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include "factories.h"
#include "bits/stdc++.h"
using namespace std;
#define int long long
const int MOD = 1e9 + 7;
mt19937_64 rng((int)std::chrono::steady_clock::now().time_since_epoch().count());
int rnd(int x, int y) {
int u = uniform_int_distribution<int>(x, y)(rng); return u;
}
void Init(int32_t N, int32_t A[], int32_t B[], int32_t D[]);
long long Query(int32_t S, int32_t X[], int32_t T, int32_t Y[]);
const int MAXN = 500003;
vector<pair<int, int> > adj[MAXN];
pair<int, signed> st[20][2*MAXN];
int tin[MAXN], tout[MAXN], cur = 0;
int dep[MAXN];
int l[MAXN], r[MAXN];
vector<int> e;
void dfs(int node, int prv, int ohno) {
tin[node] = ++cur;
dep[node] = ohno;
e.push_back(node);
for(auto x: adj[node]) {
if(x.first != prv) {
dfs(x.first, node, ohno + x.second);
e.push_back(node);
}
}
tout[node] = ++cur;
}
int lca_dep(int x, int y) {
int m1 = min(l[x], l[y]), m2 = max(r[x], r[y]);
int k = 32 - __builtin_clz(m2 - m1 + 1) - 1;
return min(st[k][m1], st[k][m2 - (1<<k) + 1]).first;
}
int dist(int x, int y) {
return dep[x] + dep[y] - 2 * lca_dep(x, y);
}
int lca_idx(int x, int y) {
int m1 = min(l[x], l[y]), m2 = max(r[x], r[y]);
int k = 32 - __builtin_clz(m2 - m1 + 1) - 1;
return min(st[k][m1], st[k][m2 - (1<<k) + 1]).second;
}
void Init(int32_t N, int32_t A[], int32_t B[], int32_t D[]) {
for(int i=0; i<N-1; i++) {
adj[A[i]].push_back({B[i], D[i]});
adj[B[i]].push_back({A[i], D[i]});
}
dfs(0, -1, 0);
for(int i=0; i<e.size(); i++) {
r[e[i]] = i;
}
for(int i=e.size()-1; i>=0; i--) {
l[e[i]] = i;
}
for(int i=0; i<e.size(); i++) st[0][i] = {dep[e[i]], e[i]};
for(int i=1; i<20; i++) {
for(int j=0; j<e.size(); j++) {
if(j + (1<<i) - 1 < e.size()) {
st[i][j] = min(st[i-1][j], st[i-1][j + (1<<(i-1))]);
}
}
}
}
long long Query(int32_t S, int32_t X[], int32_t T, int32_t Y[]) {
int ans = 1e18;
for(int i=0; i<S; i++) {
for(int j=0; j<T; j++) {
ans = min(ans, dist(X[i], Y[j]));
}
}
return ans;
}
컴파일 시 표준 에러 (stderr) 메시지
factories.cpp: In function 'void Init(int32_t, int32_t*, int32_t*, int32_t*)':
factories.cpp:59:17: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
59 | for(int i=0; i<e.size(); i++) {
| ~^~~~~~~~~
factories.cpp:65:17: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
65 | for(int i=0; i<e.size(); i++) st[0][i] = {dep[e[i]], e[i]};
| ~^~~~~~~~~
factories.cpp:67:19: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
67 | for(int j=0; j<e.size(); j++) {
| ~^~~~~~~~~
factories.cpp:68:25: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
68 | if(j + (1<<i) - 1 < e.size()) {
| ~~~~~~~~~~~~~~~^~~~~~~~~~
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |