mxqz淀粉质30pts
查看原帖
mxqz淀粉质30pts
539133
q1uple楼主2024/10/5 11:13

RT

Wa on #4,6,7,8,9

#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=2e5+5,M=2e8+7,mod=1e9+7,INF=2e9;
typedef unsigned long long ull;
typedef long long ll;
typedef pair<int,int> pii;
typedef pair<double,double> pdd;
#define qmi(a,b) a=min(a,b)
#define qma(a,b) a=max(a,b)
#define rep(i,l,r) for(int i=(l);i<=(r);i++)
#define atrep(i,l,r) for(int i=(r);i>=(l);i--)
#define vec vector<int>
#define pb push_back
struct node{
	int nxt,v,w;
}g[N*2];
int h[N],idx=0;
void add(int a,int b,int c){
	g[++idx].nxt=h[a],g[idx].v=b,g[idx].w=c,h[a]=idx;
}
int rt,sz[N],mx[N];
bool vis[N];
int n,m,num;
int dis[N],d[N];
int cnt=0; 
bitset<M>tt;// 桶 
int Q[N];
bool ans[N];
vector<int>S;
void get_rt(int u,int fa){
	sz[u]=1,mx[u]=0;
	for(int i=h[u];i;i=g[i].nxt){
		int v=g[i].v;
		if(v==fa||vis[v])	continue;
		get_rt(v,u);
		sz[u]+=sz[v];
		mx[u]=max(mx[u],sz[v]);
	}
	mx[u]=max(mx[u],num-sz[u]);
	if(mx[u]<mx[rt]||rt==0)	rt=u;
}

void get_dis(int u,int fa){
	d[++cnt]=dis[u];
	for(int i=h[u];i;i=g[i].nxt) {
		int v=g[i].v,w=g[i].w;
		if(v==fa||vis[v])	continue;
		dis[v]=dis[u]+w;
		get_dis(v,u);
	}
}

void dfs(int u,int fa){
	tt[0]=1;S.pb(0);vis[u]=1;
	for(int i=h[u];i;i=g[i].nxt){
		int v=g[i].v,w=g[i].w;
		if(v==fa||vis[v])	continue;
		dis[v]=w;get_dis(v,u);
		rep(j,1,cnt){
			rep(k,1,m){
				if(Q[k]>=d[j])	ans[k]|=tt[Q[k]-d[j]];	
			}
		}
		rep(j,1,cnt)	tt[d[j]]=1,S.pb(d[j]),
		cnt=0;
	}
	for(int i=0;i<S.size();i++)tt[S[i]]=0;S.clear();
	for(int i=h[u];i;i=g[i].nxt){
		int v=g[i].v,w=g[i].w;
		if(v==fa||vis[v])	continue;
		num=sz[v];rt=0;
		get_rt(v,u);get_rt(rt,-1);
		dfs(rt,u);
	}
}
signed main() {
	cin>>n>>m;
	rep(i,1,n-1){
		int u,v,w;
		cin>>u>>v>>w;
		add(u,v,w);add(v,u,w);	
	}
	rep(i,1,m)	cin>>Q[i];
	num=n;get_rt(1,0);get_rt(rt,0);dfs(rt,0);
	rep(i,1,m)	cout<<(ans[i]?"AYE":"NAY")<<endl;
}
2024/10/5 11:13
加载中...