样例过了,第 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;
}