求助#7tle
查看原帖
求助#7tle
32490
memory_frv楼主2021/6/27 15:37

调了好久,最后甚至和题解里的基本一样了,但是题解代码只需要13ms,我需要300ms,求各位帮帮我吧

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<vector>
using namespace std;
struct edge{
	int u,v,val,nxt;
}e[1000001];
int Minbalance=2147483647,maxp[1000001],rt,head[1000001],cnt=0,sum,vis[1000001],judge[10000001],rem[1000001],query[1000001],avl[1000001],dis[1000001],q[1000001],siz[1000001],n,m,k;
inline void add(int u,int v,int w){
	e[++cnt].v=v,e[cnt].val=w,e[cnt].nxt=head[u],head[u]=cnt;
	e[++cnt].v=u,e[cnt].val=w,e[cnt].nxt=head[v],head[v]=cnt;
}
inline int read(){
	int f=1,x=0;
	char c=getchar();
	while(c<'0'||c>'9'){
		if(c=='-') f=-1;
		c=getchar();
	}
	while(c>='0'&&c<='9'){
		x=x*10+c-'0';
		c=getchar();
	}
	return f*x;
}
inline void find_balance(int u,int fa){
	siz[u]=1;
	maxp[u]=0;
	for(int i=head[u];i;i=e[i].nxt){
		int to=e[i].v;
		if(to==fa||vis[to]) continue;
		find_balance(to,u);
		siz[u]+=siz[to];
		maxp[u]=max(maxp[u],siz[to]);
	}
	maxp[u]=max(maxp[u],sum-siz[u]);
	if(maxp[u]<maxp[rt]){
		rt=u;
	}
}
inline void getdis(int now,int fa){
	rem[++rem[0]]=dis[now];
	for(int i=head[now];i;i=e[i].nxt){
		int to=e[i].v;
		if(to==fa||vis[to]) continue;
		dis[to]=dis[now]+e[i].val;
		getdis(to,now);
	}
}
inline void calc(int u){
	int p=0;
	for(int i=head[u];i;i=e[i].nxt){
		int to=e[i].v;
		if(vis[to]) continue;
		rem[0]=0;dis[to]=e[i].val;
		getdis(to,u);
		for(int j=rem[0];j;j--){
			for(int l=1;l<=m;l++){
				if(query[l]>=rem[j])
				avl[l]|=judge[query[l]-rem[j]];
			}
		}
		for(int j=rem[0];j;j--){
			judge[rem[j]]=1;q[++p]=rem[j];
		}
	}
	for(int i=1;i<=p;i++) judge[q[i]]=0;
}
inline void solve(int now){
	vis[now]=judge[0]=1;calc(now);
	for(int i=head[now];i;i=e[i].nxt){
		int to=e[i].v;
		if(vis[to]) continue;
		sum=siz[to];maxp[rt=0]=2147483647;
		find_balance(to,0);solve(rt);
	}
}
int main(){
	n=read(),m=read();int u,v,w;
	for(int i=0;i<n-1;i++){
		u=read(),v=read(),w=read();
		add(u,v,w);
	}
	for(int i=1;i<=m;i++) query[i]=read();
	maxp[rt]=sum=n;
	find_balance(1,0);
	solve(rt);
	for(int i=1;i<=m;i++){
		if(avl[i])	printf("AYE\n");
		else printf("NAY\n");
	}
	return 0;
}
2021/6/27 15:37
加载中...