이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N = 2e5 + 5;
const int inf = 1e9;
bool minimize(int &a, int b) {
if(a <= b) return true;
a = b;
return false;
}
int n, sz[N], ans = inf;
vector<int> g[N];
multiset<int> anc, oth;
vector<int> opt(int x, multiset<int> &sett) {
auto it = sett.lower_bound(x);
vector<int> v;
v.push_back(*it);
--it;
v.push_back(*it);
return v;
}
int cost(int a, int b, int c) {
return max({a, b, c}) - min({a, b, c});
}
void dfs_size(int u, int p = 0) {
sz[u] = 1;
for(int v : g[u]) if(v != p) {
dfs_size(v, u);
sz[u] += sz[v];
}
}
void dfs(int u, int p = 0) {
for(int x : opt(n + sz[u] >> 1, anc)) {
minimize(ans, cost(sz[u], n - x, x - sz[u]));
}
for(int x : opt(n - sz[u] >> 1, oth)) {
minimize(ans, cost(sz[u], n - sz[u] - x, x));
}
anc.insert(sz[u]);
for(int v : g[u]) if(v != p) dfs(v, u);
anc.erase(anc.find(sz[u]));
oth.insert(sz[u]);
}
void solve() {
cin >> n;
for(int i = 1, u, v; i < n; ++i) {
cin >> u >> v;
g[u].push_back(v);
g[v].push_back(u);
}
anc.insert(-inf); anc.insert(inf);
oth.insert(-inf); oth.insert(inf);
dfs_size(1);
dfs(1);
cout << ans << '\n';
}
signed main() {
ios::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
int test = 1;
// cin >> test;
while(test--) solve();
return 0;
}
컴파일 시 표준 에러 (stderr) 메시지
papricice.cpp: In function 'void dfs(int, int)':
papricice.cpp:39:23: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
39 | for(int x : opt(n + sz[u] >> 1, anc)) {
| ~~^~~~~~~
papricice.cpp:42:23: warning: suggest parentheses around '-' inside '>>' [-Wparentheses]
42 | for(int x : opt(n - sz[u] >> 1, oth)) {
| ~~^~~~~~~| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |