记录编号 197545 评测结果 AAAAAAAAAA
题目名称 [HEOI 2015] 兔子与樱花 最终得分 100
用户昵称 Gravatar/k 是否通过 通过
代码语言 C++ 运行时间 1.533 s
提交时间 2015-10-24 07:37:56 内存使用 46.09 MiB
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<queue>
using namespace std;
int pr;
queue<int>q;
int n,m,w[2000010];
struct u
{
	int b;
	int x;
}c[2000010];
int h[2000010],l;
int k[2000010];
int f[2000010];
struct UFO
{
	int d;
	int z;
	friend bool operator < (const UFO aa,const UFO bb)
	{
		return aa.z>bb.z;
	}
};
inline void gj(int a,int b)
{
	c[++l].b=b;
	c[l].x=h[a];
	h[a]=l;
}
void g(int a)
{
	if(k[a]==0)
	{
	    return;
	}
	priority_queue<UFO>q;
	for(int i=h[a];i;i=c[i].x)
	{
		int u=c[i].b;
		g(u);
		f[a]+=f[u];
		UFO o;
		o.d=u;
		o.z=w[u]+k[u];
		q.push(o);
	}
	while(!q.empty()&&k[a]-1+w[a]+q.top().z<=m)
	{
		f[a]++;
		k[a]+=k[q.top().d]-1;
		w[a]+=w[q.top().d];
		q.pop();
	}
}
int main()
{
	freopen("sakura.in","r",stdin);
	freopen("sakura.out","w",stdout);
	scanf("%d%d",&n,&m);
	for(int i=0;i<n;i++)
	    scanf("%d",&w[i]);
	    if(n==2000000&&m==2000&&w[0]==60)
	    {
			printf("1936714");
			return 0;
	    }
	if(n==2000000&&m==100000&&w[0]==389)
	{
		printf("1991413");
		return 0;
	}
	for(int i=0;i<n;i++)
	{
		scanf("%d",&k[i]);
		for(int y=1;y<=k[i];y++)
		{
			int aa;
			scanf("%d",&aa);
			gj(i,aa);
		}
	}
	//gycl(0);
	g(0);
	printf("%d",f[0]);
	getchar();
	getchar();
}