淀粉质求条
查看原帖
淀粉质求条
728778
hdkk楼主2024/3/31 18:35

基本照着题解写的,只过了7,9,10,求助dalao/kk

#include<bits/stdc++.h>
using namespace std;
int siz[10005],num,head[10005],q1[10005],n,m,sum,maxp[10005],rt,dis[10005],rem[10005],len,q[10005];
bool vis[10005],t[10000005],q2[10005];
struct edge{
	int to,next,val;
}g[20005];
void addd(int u,int v,int w)
{
	num++;
	g[num].to=v;
	g[num].next=head[u];
	g[num].val=w;
	head[u]=num;
}
void getrt(int u,int fa)
{
	siz[u]=1;
	maxp[u]=0;
	for(int i=head[u];i;i=g[i].next)
	{
		int v=g[i].to;
		if(v==fa||vis[v]) continue;
		getrt(v,u);
		siz[u]+=siz[v];
		maxp[u]=max(maxp[u],siz[v]);
	}
	maxp[u]=max(maxp[u],sum-siz[u]);
	if(maxp[u]<maxp[rt])
		rt=u;
}
void getdis(int u,int fa)
{
	int p=0;
	if(dis[u]>1e7) return;
	rem[++len]=dis[u];
	for(int i=head[u];i;i=g[i].next)
	{
		int v=g[i].to;
		if(v==fa||vis[v]) continue;
		dis[v]=dis[u]+g[i].val;
		getdis(v,u);
	}
}
void calc(int u)
{
	t[0]=vis[u]=1;
	int p=0;
	for(int i=head[u];i;i=g[i].next)
	{
		int v=g[i].to;
		if(vis[v]) continue;
		len=0;
		dis[v]=g[i].val;
		getdis(v,u);
		for(int j=1;j<=len;j++)
		{
			for(int j1=1;j1<=m;j1++)
				if(rem[j]>=q1[j1]) q2[j1]|=t[rem[j]-q1[j1]];
		}
		for(int j=1;j<=len;j++)
			q[++p]=rem[j],t[rem[j]]=1;
	}
	for(int i=1;i<=p;i++)
		t[q[i]]=0;
}
void slove(int u)
{
	t[u]=vis[u]=1,calc(u);
	for(int i=head[u];i;i=g[i].next)
	{
		int v=g[i].to;
		if(vis[v]) continue;
		sum=siz[v],maxp[rt=0]=INT_MAX;
		getrt(v,u);
		slove(rt); 
	}
}
int main()
{
	cin>>n>>m;
	for(int i=1;i<n;i++)
	{
		int u,v,w;
		cin>>u>>v>>w;
		addd(u,v,w);
		addd(v,u,w);
	}
	for(int i=1;i<=m;i++)
		cin>>q1[i];
	maxp[rt]=sum=n;
	getrt(1,0);
	slove(rt);
	for(int i=1;i<=m;i++)
	{
		if(q2[i]) cout<<"AYE"<<endl;
		else
			cout<<"NAY"<<endl;
	}
}
2024/3/31 18:35
加载中...