社区讨论

淀粉汁代码玄关求条

P3806【模板】点分治参与者 2已保存回复 1

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
1 条
当前快照
1 份
快照标识符
@m66i5k0x
此快照首次捕获于
2025/01/21 21:19
去年
此快照最后确认于
2025/11/04 11:05
4 个月前
查看原帖
CPP
#include<cstdio>
#include<vector>
#include<algorithm>
#define QwQ return 0
using namespace std;
const int N=1e5+50;
struct ed{int v,w;};
vector<ed>e[N];
int root,dep[N],f[N],size[N],n,k,m,que[N],S,tot,len[N];
bool vis[N],ans[10000150];
void getroot(int u,int fa){
	f[u]=0,size[u]=1;
	for(auto x:e[u]){
		int v=x.v;
		if(vis[v]||v==fa)continue;
		getroot(v,u);
		size[u]+=size[v];
		f[u]=max(f[u],size[v]);
	}
	f[u]=max(f[u],S-size[u]);
	if(f[u]<f[root])root=u;
}
void getdep(int u,int fa){
	for(auto x:e[u]){
		int v=x.v,w=x.w;
		if(v==fa||vis[v])continue;
		dep[v]=dep[u]+w;
		len[++tot]=dep[v];
		ans[len[tot]]=1;
		getdep(v,u);
	}
}
void getans(int u){
	dep[u]=0;
	tot=0;
	getdep(u,0);
	for(int i=1;i<=tot;i++){
		if(i+1>tot)break;
		for(int j=i+1;j<=tot;j++){
			if(len[i]+len[j]<=10000000)ans[len[i]+len[j]]=1;
		}
	}
}
void sol(int u){
	vis[u]=1;
	getans(u);
	for(auto x:e[u]){
		int v=x.v;
		if(vis[v])continue;
		S=size[v];
		root=0,f[v]=N;
		getroot(v,u);
		sol(root);
	}
}
int main(){
	scanf("%d%d",&n,&m);
	for(int i=1,cu,cv,cw;i<n;i++){
		scanf("%d%d%d",&cu,&cv,&cw);
		e[cu].push_back({cv,cw});
		e[cv].push_back({cu,cw});
	}
	for(int i=1;i<=m;i++){
		scanf("%d",&k);
		que[i]=k;
	}
	f[0]=N,S=n;
	getroot(1,0);
	sol(root);
	for(int i=1;i<=m;i++){
		if(ans[que[i]])printf("AYE\n");
		else printf("NAY\n");
	}
	QwQ;
}

回复

1 条回复,欢迎继续交流。

正在加载回复...