社区讨论

0pts求调,悬一关

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

讨论操作

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

当前回复
2 条
当前快照
1 份
快照标识符
@mhjthp3t
此快照首次捕获于
2025/11/04 08:15
4 个月前
此快照最后确认于
2025/11/04 08:15
4 个月前
查看原帖
求求了qwq
CPP
#include<bits/stdc++.h>
#define v first
#define w second
using namespace std;
const int N=1e4+5,M=1e7+5;
int n,m,req[N],ans[N];
int root,cnt,ok[N],sz[N],f[N],rec[M];
int st[N],top;
vector< pair<int,int> > e[N];

int build(int u,int lst)
{
	sz[u]=1,cnt++;
	for(int i=0;i<e[u].size();i++)
	{
		int v=e[u][i].v;
		if(ok[v]==1 || v==lst) continue;
		sz[u]+=build(v,u);
	}
	return sz[u];
}

void GetRot(int u,int lst)
{
	f[u]=cnt-sz[u];
	for(int i=0;i<e[u].size();i++)
	{
		int v=e[u][i].v;
		if(ok[v]==1 || v==lst) continue;
		f[u]=max(f[u],sz[v]);
		GetRot(v,u);
	}
	if(!root || f[u]<f[root]) root=u;
	return ;
}

void dfs(int u,int lst,int tot)
{
	st[++top]=tot;
	for(int i=0;i<e[u].size();i++)
	{
		int v=e[u][i].v;
		if(ok[v]==1 || v==lst) continue;
		dfs(v,u,tot+e[u][i].w);
	}
	return ;
}

void GetAns(int u)
{
	cnt=0,root=0,top=0,rec[0]=1;
	build(u,u);
	GetRot(u,u);
	for(int i=0;i<e[root].size();i++)
	{
		int x=e[root][i].v;
		if(ok[x]==1) continue;
		int val=top+1;
		dfs(x,root,e[root][i].w);
		for(int id=1;id<=m;id++)
			for(int p=val;p<=top;p++)
				if(st[p]<=req[id] && rec[req[id]-st[p]]==1)
					ans[id]=1;
		for(int p=val;p<=top;p++)
			if(st[p]<M) rec[st[p]]=1;
	}
	while(top--)
		if(st[top]<M) rec[st[top]]=0;
	ok[root]=1;
	for(int i=0;i<e[root].size();i++)
	{
		int x=e[root][i].v;
		if(ok[x]==0) GetAns(x);
	}
	return ;
}

int main()
{
	scanf("%d%d",&n,&m);
	for(int i=1;i<n;i++)
	{
		int u,v,w;
		scanf("%d%d%d",&u,&v,&w);
		e[u].push_back(make_pair(v,w));
		e[v].push_back(make_pair(u,w));
	}
	for(int i=1;i<=m;i++) scanf("%d",req+i);
	GetAns(1);
	for(int i=1;i<=m;i++)
	{
		if(ans[i]==1 || req[i]==0) printf("AYE\n");
		else printf("NAY\n");
	}
	return 0;
}

回复

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

正在加载回复...