1002A
已结束
IOI
开始于: 2026-10-2 8:30
3
小时
主持人:
51
题目难度与顺序无关
T1
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 1e5 + 5;
int s, n, a[N], f[N];
vector<int>e[N];
bool cmp(int x, int y) {
return f[x] > f[y];
}
void dfs(int x, int fa) {
vector<int>cnt;
for (auto v : e[x]) {
if (v == fa || a[v] == 0)
continue;
dfs(v, x);
cnt.push_back(v);
}
sort(cnt.begin(), cnt.end(), cmp);
for (int i = 0; i < cnt.size(); i++) {
int v = cnt[i];
if (x != s && a[x] >= 2 && f[v] != 0) {
f[x] += f[v];
f[x] += 2;
a[x]--;
a[v]--;
}
if (x == s && a[x] >= 1 && f[v] != 0) {
f[x] += f[v];
f[x] += 2;
a[x]--;
a[v]--;
}
}
for (auto v : e[x]) {
if (v == fa)
continue;
if (x != s && a[x] > 1) {
f[x] += min(a[v], a[x] - 1) * 2;
a[x] -= min(a[v], a[x] - 1);
a[v] -= min(a[v], a[x] - 1);
} else if (x == s && a[x] > 0) {
f[x] += min(a[v], a[x]) * 2;
a[x] -= min(a[v], a[x]);
a[v] -= min(a[v], a[x]);
}
}
}
signed main() {
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> a[i];
}
for (int i = 1; i < n; i++) {
int x, y;
cin >> x >> y;
e[x].push_back(y);
e[y].push_back(x);
}
cin >> s;
dfs(s, 0);
cout << f[s] << endl;
return 0;
}
- 状态
- 已结束
- 规则
- IOI
- 题目
- 4
- 开始于
- 2026-10-2 8:30
- 结束于
- 2026-10-2 11:30
- 持续时间
- 3 小时
- 主持人
- 参赛人数
- 51