传送门:https://codeforces.ml/contest/767/problem/C
题意
给一棵树,每个节点都有点权,问能否将树三等分后,每份子树的节点和相等?
思路
因为是树上操作,所以dfs,记录每个子树的节点和val。 如果val[x]=sum/3,说明该点为一个分割点。
Code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54
| ##include "bits/stdc++.h" using namespace std;
const int N = 2e6 + 10;
struct Edge { int v, next; }e[N]; int head[N], cnt; int root, val[N]; int tot = 0; int sum3; vector<int> ans(3);
void add(int u, int v) { e[++cnt].v = v; e[cnt].next = head[u]; head[u] = cnt; }
void dfs(int u) { for(int i = head[u]; i; i = e[i].next) { dfs(e[i].v); val[u] += val[e[i].v]; } if(val[u] == sum3 && u != root && tot <= 1) val[u] = 0, ans[++tot] = u; }
void solve() { ans[1] = ans[2] = -1; int n; cin >> n; int sum = 0; for(int i = 1;i <= n; i++) { int v, w; cin >> v >> w; sum += w; val[i] = w; if(v == 0) root = i; else add(v, i); } if(sum % 3) { cout << -1 << endl; return ; } sum3 = sum / 3; dfs(root); if(ans[1] != -1 && ans[2] != -1 && val[root] == sum3) { cout << ans[1] << " " << ans[2] << endl; } else cout << -1 << endl; }
signed main() { solve(); }
|
本文作者:jujimeizuo
本文地址: https://blog.jujimeizuo.cn/2021/03/21/codeforces-round-398-div-2-c/
本博客所有文章除特别声明外,均采用 CC BY-SA 3.0 协议。转载请注明出处!