比赛 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;
}