这题点分治好卡常啊,#7#9tle麻烦问一下原因
查看原帖
这题点分治好卡常啊,#7#9tle麻烦问一下原因
153274
ignited楼主2021/9/7 15:27
#include<bits/stdc++.h>
#define MAXN 10010
#define MAXM 10000010
using namespace std;

struct edge
{
	int to,val;
};

int n,m,sum,root,tot,size[MAXN],dp[MAXN],vis[MAXN],dis[MAXN],rev[MAXN],query[MAXN],d[MAXN];
bool pd[MAXM],bin[MAXM];
vector<edge> g[MAXN];

inline void getroot(int u,int f)
{
	dp[u]=0,size[u]=1;
	for(int i=0;i<g[u].size();i++)
	{
		int v=g[u][i].to;
		if(v==f||vis[v]) continue;
		getroot(v,u);
		size[u]+=size[v];
		dp[u]=max(dp[u],size[v]);
	}
	dp[u]=max(dp[u],sum-size[u]);
	if(dp[u]<dp[root]) root=u;
}

inline void getdis(int u,int f)
{
	rev[++tot]=dis[u];
	for(int i=0;i<g[u].size();i++)
	{
		int v=g[u][i].to;
		if(vis[v]||v==f) continue;
		dis[v]=dis[u]+g[u][i].val;
		getdis(v,u);
	}
}

inline void solve(int u)
{
	
	int c=0;
	for(int i=0;i<g[u].size();i++)
	{
		int v=g[u][i].to;
		if(vis[v]) continue;
		dis[v]=g[u][i].val,tot=0;
		getdis(v,u);
		for(int j=1;j<=tot;j++) 
		for(int k=1;k<=m;k++) 
			if(query[k]>=rev[j]) bin[query[k]]|=pd[query[k]-rev[j]]; 
		for(int j=1;j<=tot;j++) if(rev[j]<=10000000) d[++c]=rev[j],pd[rev[j]]=1;
	}
	for(int i=1;i<=c;i++) pd[d[i]]=0;
}

inline void divid(int u)
{
	vis[u]=pd[0]=1;
	solve(u);
	for(int i=0;i<g[u].size();i++)
	{
		int v=g[u][i].to;
		if(vis[v]) continue;
		dp[0]=n,sum=size[v],root=0;
		getroot(v,u);
		divid(v);
	}
}

int main()
{
	cin>>n>>m;
	dp[0]=n;root=0;
	for(int i=1;i<n;i++)
	{
		int u,v,w;
		scanf("%d%d%d",&u,&v,&w);
		g[u].push_back((edge){v,w});
		g[v].push_back((edge){u,w});
	}
	for(int i=1;i<=m;i++) scanf("%d",&query[i]);
	getroot(1,0);
	divid(root);
	for(int i=1;i<=m;i++)
	if(bin[query[i]]) puts("AYE");
	else puts("NAY");
	return 0;
} 

是STL太卡吗

2021/9/7 15:27
加载中...