이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <bits/stdc++.h>
using namespace std;
using pii = pair<int, int>;
using ll = long long;
#define ff first
#define ss second
int N, Q, dfn[200005], dfnn, efn[200005], par[200005];
bool used[200005];
vector<pair<int, pii> > edge[200005];
ll ans[200005], D[200005];
ll dfs1(int x, int p) {
ll ret = 0;
for (auto i : edge[x]) {
if (i.ff == p) continue;
ret += dfs1(i.ff, x) + i.ss.ff;
}
return ret;
}
ll dfs2(int x, int p, ll v) {
ll ret = v;
for (auto i : edge[x]) {
if (i.ff == p) continue;
ll t = v - i.ss.ff + i.ss.ss;
ret = min(ret, t);
dfs2(i.ff, x, t);
}
return ret;
}
int dfs3(int x, int p) {
if (x == p) D[x] = 0;
dfn[x] = ++dfnn;
par[x] = p;
int ret = x;
for (auto i : edge[x]) {
if (i.ff == p) continue;
D[i.ff] = D[x] + i.ss.ff;
int t = dfs3(i.ff, x);
if (D[ret] < D[t]) ret = t;
}
efn[x] = dfnn;
return ret;
}
const int SIZE = 1 << 18;
struct ST {
struct Node {
pair<ll, int> v;
ll l;
} A[2 * SIZE];
void init() {
for (int i = 1; i <= N; ++i) A[dfn[i] + SIZE].v = {D[i], i};
for (int i = SIZE - 1; i; --i) A[i].v = max(A[i << 1].v, A[i << 1 | 1].v);
}
void busy(int nn) {
A[nn << 1].v.ff += A[nn].l;
A[nn << 1].l += A[nn].l;
A[nn << 1 | 1].v.ff += A[nn].l;
A[nn << 1 | 1].l += A[nn].l;
A[nn].l = 0;
}
void update(int nn, int ns, int ne, int s, int e, int v) {
if (ns > e || ne < s) return;
if (s <= ns && ne <= e) { A[nn].v.ff += v;
A[nn].l += v;
return;
}
int m = ns + ne >> 1;
busy(nn);
update(nn << 1, ns, m, s, e, v);
update(nn << 1 | 1, m + 1, ne, s, e, v);
A[nn].v = max(A[nn << 1].v, A[nn << 1 | 1].v);
}
pair<ll, int> query(int nn, int ns, int ne, int s, int e) {
if (ns > e || ne < s) return {0, 0};
if (s <= ns && ne <= e) return A[nn].v;
busy(nn);
int m = ns + ne >> 1;
return max(query(nn << 1, ns, m, s, e), query(nn << 1 | 1, m + 1, ne, s, e));
}
void update(int s, int e, int v) { update(1, 0, SIZE - 1, s, e, v); }
pair<ll, int> query(int s, int e) { return query(1, 0, SIZE - 1, s, e); }
} seg;
int main() {
ios_base::sync_with_stdio(0), cin.tie(0);
cin >> N;
for (int i = 1; i < N; ++i) {
int a, b, c, d; cin >> a >> b >> c >> d;
edge[a].emplace_back(b, pii(c, d));
edge[b].emplace_back(a, pii(d, c));
}
ans[0] = dfs2(1, 1, dfs1(1, 1));
int X = dfs3(1, 1);
used[X] = 1;
dfnn = 0;
dfs3(X, X);
ans[1] = dfs1(X, X);
seg.init();
vector<int> vec;
for (int i = 2; i <= N; ++i) {
auto t = seg.query(1, dfnn);
if (t.ff == 0) {
while (i <= N) ans[i++] = ans[i - 1];
break;
}
ans[i] = ans[i - 1] - t.ff;
for (int x = t.ss; !used[x]; x = par[x]) vec.push_back(x);
while (vec.size()) {
int a = vec.back(); vec.pop_back();
used[a] = 1;
seg.update(dfn[a], efn[a], D[par[a]] - D[a]);
}
}
cin >> Q;
while (Q--) {
int x; cin >> x;
if (x == 1) x--;
printf("%lld\n", ans[x]);
}
return 0;
}
컴파일 시 표준 에러 (stderr) 메시지
designated_cities.cpp: In member function 'void ST::update(int, int, int, int, int, int)':
designated_cities.cpp:71:14: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
int m = ns + ne >> 1;
~~~^~~~
designated_cities.cpp: In member function 'std::pair<long long int, int> ST::query(int, int, int, int, int)':
designated_cities.cpp:81:14: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
int m = ns + ne >> 1;
~~~^~~~
designated_cities.cpp: In function 'int main()':
designated_cities.cpp:108:24: warning: operation on 'i' may be undefined [-Wsequence-point]
while (i <= N) ans[i++] = ans[i - 1];
~^~
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |