社区讨论

TLE #7#9 求助!(悬关)

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

讨论操作

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

当前回复
2 条
当前快照
1 份
快照标识符
@m05ny9b0
此快照首次捕获于
2024/08/23 03:16
2 年前
此快照最后确认于
2025/11/04 22:42
4 个月前
查看原帖
CPP
# include<iostream>
# include<algorithm>
# include<cmath>
# include<vector>
# include<set>
# define endl "\n"
# define int long long
using namespace std;
const int maxn=100001, maxk=10000001;
struct Node{
	int u, v, w, next;
}edge[maxn];
int n, m, head[maxn], vis[maxn], query[maxn], ans[maxn], cnt=0;
int size[maxn], minweight[3];
int dis[maxn], s1[maxk], s2[maxn], t[maxn], s2cnt=0, tcnt=0;
void add(int u, int v, int w) {
	edge[++cnt].u=u;
	edge[cnt].v=v;
	edge[cnt].w=w;
	edge[cnt].next=head[u];
	head[u]=cnt;
}
void get_core(int u, int fa) {
	int weight=0;
	size[u]=1;
	for(int i=head[u]; i; i=edge[i].next) {
		int v=edge[i].v, w=edge[i].w;
		if(v==fa || vis[v]==true) continue ;
		get_core(v, u);
		size[u]+=size[v];
		weight=max(weight, size[v]);
	}
	weight=max(weight, n-size[u]);
	if(minweight[0]==0 || minweight[1]>weight) {
		minweight[0]=1;
		minweight[1]=weight;
		minweight[2]=u;
	}
}
void dep(int u, int fa) {
	s2[++s2cnt]=dis[u];
	for(int i=head[u]; i; i=edge[i].next) {
		int v=edge[i].v, w=edge[i].w;
		if(v==fa || vis[v]) continue;
		dis[v]=dis[u]+w;
		dep(v, u); 
	}
}
void dfs(int u) {
	s1[0]=vis[u]=true; tcnt=0;
	for(int i=head[u]; i; i=edge[i].next) {
		int v=edge[i].v, w=edge[i].w;
		if(vis[v]) continue;
		s2cnt=0; dis[v]=w;
		dep(v, u);
		
		for(int j=s2cnt; j>=1; j--)
			for(int k=1; k<=m; k++)
				if(query[k]>=s2[j] && s1[query[k]-s2[j]])
					ans[k]=true;
		for(int j=s2cnt; j>=1; j--) if(s2[j]<maxk) t[++tcnt]=s2[j], s1[s2[j]]=true;
	}
	for(int i=1; i<=tcnt; i++) s1[t[i]]=0;
	
	for(int i=head[u]; i; i=edge[i].next) {
		int v=edge[i].v, w=edge[i].w;
		if(vis[v]) continue;
		minweight[0]=0;
		get_core(v, u);
		dfs(minweight[2]); 
	}
} 
signed main() {
	cin >> n >> m;
	for(int i=1; i<n; i++) {
		int u, v, w; scanf("%d%d%d", &u, &v, &w);
		add(u, v, w); add(v, u, w);
	}
	for(int i=1; i<=m; i++) cin >> query[i];
	minweight[0]=0; 
	get_core(1, 0);
	dfs(minweight[2]);
	for(int i=1; i<=m; i++)
		if(ans[i]) cout << "AYE" << endl;
		else cout << "NAY" << endl;
	return 0;
}
aaa实在是不会调了qwq

回复

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

正在加载回复...