求助0分
查看原帖
求助0分
571841
ZVitality楼主2022/7/14 15:45

样例过了,第 5,第 9,第 10 个点 RE,其他都是 WA。

#include <bits/stdc++.h>
using namespace std;

const int Max = 2000005;

int total[Max];
int sum[Max],c[Max];
int l[Max],r[Max];
int cnt,ans;
int n,m;

int Cmp(int a,int b) {
	return sum[a] + c[a] < sum[b] < c[b];
}

void DFS(int x) {
	if(!sum[x]) return;
	for(int i = l[x];i <= r[x];i++) DFS(total[i]);
	sort(total + l[x],total + r[x] + 1,Cmp);
	for(int i = l[x];i <= r[x];i++) {
		if(c[total[i]] + sum[total[i]] + c[x] + sum[x] - 1 <= m) {
			ans++;
			c[x] += c[total[i]];
			sum[x] += sum[total[i]] - 1;
		}
		else break;
	}
}

int main() {
	scanf("%d%d",&n,&m);
	for(int i = 1;i <= n;i++) scanf("%d",&c[i]);
	for(int i = 1;i <= n;i++) {
		scanf("%d",&sum[i]);
		l[i] = cnt + 1,r[i] = cnt + sum[i];
		for(int j = 1,x;j <= sum[i];j++) scanf("%d",&x),total[++cnt] = x + 1;
	}
	DFS(1);
	printf("%d\n",ans);
	return 0;
}
2022/7/14 15:45
加载中...