淀粉质求助
查看原帖
淀粉质求助
549499
Disjoint_cat楼主2022/10/3 10:01

不知为何,#1数据本机AC,洛谷全部RE

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=10005,K=10000005;
int n,m,U,V,W,q,siz[N],root,ma[N],LEN,t;
vector<int>to[N],dis[N],v,tr;
bool can[K],Vis[N];
int froot(int now,int fa)
{
	siz[now]=1,ma[now]=0;int t;
	for(int i=0;i<to[now].size();i++)
		if((t=to[now][i])!=fa&&!Vis[t])
		{
			froot(t,now);
			siz[now]+=siz[t],ma[now]=max(ma[now],siz[t]);
		}
	ma[now]=max(ma[now],LEN-siz[now]);
	if(ma[now]<ma[root])root=now;
}
void dfs(int now,int fa,int len,int Tr)
{
	v.push_back(len),tr.push_back(Tr);
	for(int i=0;i<to[now].size();i++)
		if((t=to[now][i])!=fa)
			dfs(t,now,len+dis[now][i],Tr);
}
void sol(int Root)
{
	v.clear(),tr.clear(),v.push_back(0),tr.push_back(0);
	for(int i=0;i<to[Root].size();i++)
		if(!Vis[t=to[Root][i]])
			dfs(t,Root,dis[Root][i],t);
	for(int i=0;i<v.size();i++)
		for(int j=i+1;j<v.size();j++)
			if(tr[i]!=tr[j])can[v[i]+v[j]]=1;
}
void dfz(int Root)
{
	Vis[Root]=1;
	sol(Root);
	for(int i=0;i<to[Root].size();i++)
		if(!Vis[t=to[Root][i]])
		{
			//sol(t);
			LEN=siz[t],root=0;
			froot(t,0);
			dfz(root);
		}
}
int main()
{
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	cin>>n>>m;
	for(int i=1;i<n;i++)
	{
		cin>>U>>V>>W;
		to[U].push_back(V),to[V].push_back(U),dis[U].\
		push_back(W),dis[V].push_back(W);
	}
	LEN=n,ma[0]=n,root=0;froot(1,0);
	dfz(root);
	while(m--)
	{
		cin>>q;
		puts(can[q]?"AYE":"NAY");
	}
	return 0;
}
2022/10/3 10:01
加载中...