萌新求调点分治
查看原帖
萌新求调点分治
400269
Jorisy楼主2024/3/30 20:09

wa * 8 tle * 2

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

vector<pair<int,int>>g[10005];
int n,m,wc,sz[10005],d[10005],f[10005],nowd[10005],sum,q[10000005],ans[10005],vis[10005],jd[10000005];

void dfswc(int p,int lst)
{
	//cerr<<'w';
	sz[p]=1;
	f[p]=0;
	for(auto i:g[p])
	{
		if(i.first==lst||vis[i.first]) continue;
		dfswc(i.first,p);
		sz[p]+=sz[i.first];
		f[p]=max(f[p],sz[i.first]);
	}
	f[p]=max(f[p],n-sz[p]);
	if(f[p]<f[wc]) wc=p;
}

void dfsd(int p,int lst)
{
	//cerr<<'d';
	nowd[++nowd[0]]=d[p];
	for(auto i:g[p])
	{
		if(i.first==lst||vis[i.first]) continue;
		d[i.first]=d[p]+i.second;
		dfsd(i.first,p);
	}
}

void vdiv(int p)
{
	//cerr<<'v'<<p<<endl;
	vis[p]=jd[0]=1;
	int t=0;
	for(auto i:g[p])
	{
		if(vis[i.first]) continue;
		nowd[0]=0;
		d[i.first]=i.second;
		dfsd(i.first,p);
		for(int j=nowd[0];j;j--)
		{
			for(int k=1;k<=m;k++)
			{
				if(q[k]>=nowd[j]) ans[k]|=jd[q[k]-nowd[j]];
			}
		}
		for(int j=nowd[0];j;j--)
		{
			q[++t]=nowd[j];
			jd[nowd[j]]=1;
		}
	}
	for(int i=1;i<=t;i++) jd[q[i]]=0; 
	//cerr<<'|';
	for(auto i:g[p])
	{
		if(vis[i.first]) continue;
		sum=sz[i.first];
		f[wc=0]=1e9;
		dfswc(i.first,0);
		vdiv(wc);
	}
}

int main()
{
	cin>>n>>m;
	for(int i=1;i<n;i++)
	{
		int u,v,w;
		cin>>u>>v>>w;
		g[u].push_back({v,w});
		g[v].push_back({u,w});
	}
	for(int i=1;i<=m;i++) cin>>q[i];
	f[wc]=sum=n;
	dfswc(1,0);
	vdiv(wc);
	for(int i=1;i<=m;i++) puts(ans[i]?"AYE":"NAY");
 	return 0;
}
2024/3/30 20:09
加载中...