| 比赛 |
ry分享赛 |
评测结果 |
AAWTTTTTTT |
| 题目名称 |
砍树 |
最终得分 |
20 |
| 用户昵称 |
终焉折枝 |
运行时间 |
7.941 s |
| 代码语言 |
C++ |
内存使用 |
52.54 MiB |
| 提交时间 |
2026-03-19 20:17:20 |
显示代码纯文本
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int MAXN = 2 * 1e6 + 5;
int n, m, ans = 0;
int p[MAXN], w[MAXN];
vector<int> G[MAXN];
mt19937 rng(time(0));
void dfs(int u){
for(int v : G[u]){
dfs(v);
}
w[u] = p[u] + G[u].size();
int cnt = 1000;
int base = p[u] + G[u].size();
int maxx = 0, WU = base;
while(cnt --){
shuffle(G[u].begin(), G[u].end(), rng);
int wu = base, res = 0;
for(int v : G[u]){
if(wu + w[v] - 1 <= m){
wu += w[v] - 1;
res ++;
}
}
if(res > maxx){
maxx = res;
WU = wu;
}
}
w[u] = WU;
ans += maxx;
}
signed main(){
freopen("cuttree.in", "r", stdin);
freopen("cuttree.out", "w", stdout);
cin.tie(0) -> ios::sync_with_stdio(0);
cin >> n >> m;
for(int i = 0;i < n;i ++){
cin >> p[i];
}
for(int i = 0;i < n;i ++){
int sz; cin >> sz;
for(int j = 1;j <= sz;j ++){
int v; cin >> v;
G[i].push_back(v);
}
}
dfs(0);
cout << ans << '\n';
return 0;
}