记录编号 |
197544 |
评测结果 |
AAAAAAAAAA |
题目名称 |
[HEOI 2015] 兔子与樱花 |
最终得分 |
100 |
用户昵称 |
zys |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
3.574 s |
提交时间 |
2015-10-24 07:34:49 |
内存使用 |
40.36 MiB |
显示代码纯文本
#include<cstdio>
#include<queue>
#include<algorithm>
using namespace std;
bool vis[2000010];
int n,m,first[2000010],tot;
int ver[2000010],son[2000010],Ans;
struct Edge{
int v,next;
}edge[2000010];
struct My_define{
int id,w;
friend bool operator < (My_define a,My_define b){
return a.w>b.w;
}
}temp,tmp;
void Add(int u,int v)
{
edge[++tot].v=v;
edge[tot].next=first[u];
first[u]=tot;
}
void Tree_DP(int rt)
{
if(!son[rt])return;
priority_queue<My_define>q;
while(!q.empty())q.pop();
for(int i=first[rt];i!=-1;i=edge[i].next){
Tree_DP(edge[i].v);temp.id=edge[i].v;
temp.w=son[edge[i].v]+ver[edge[i].v];
q.push(temp);
}
while(true){
if(!q.empty()){
temp=q.top();q.pop();
if(son[rt]+ver[rt]+temp.w-1<=m){
vis[temp.id]=1;Ans++;
ver[rt]+=ver[temp.id];
son[rt]+=son[temp.id]-1;
continue;
}
else break;
}
else break;
}
}
int main()
{
freopen("sakura.in","r",stdin);
freopen("sakura.out","w",stdout);
scanf("%d%d",&n,&m);
for(int i=0;i<=n;i++)first[i]=-1;
for(int i=0;i<n;i++)scanf("%d",&ver[i]);
for(int i=0;i<n;i++){
scanf("%d",&son[i]);
for(int j=1,v;j<=son[i];j++){
scanf("%d",&v);
Add(i,v);
}
}Tree_DP(0);
printf("%d",Ans);
}