MnZn求助点分治!!请求各路大佬出山!!
  • 板块学术版
  • 楼主Robert123456
  • 当前回复8
  • 已保存回复8
  • 发布时间2021/11/12 09:50
  • 上次更新2023/11/4 00:50:07
查看原帖
MnZn求助点分治!!请求各路大佬出山!!
239251
Robert123456楼主2021/11/12 09:50

传送门

第一个样例下下来自己跑没有问题,但上去就TLE了!!

看到讨论区很多人都这样但是没有人回复,前来请大佬出山帮忙看看!!

代码:(马蜂不毒

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e7+10;
const int N=1e4+100;
const int M=1e6;
struct node{
	int nxt,to,w;
}e[N*2];
int head[N],S;
int size[N],dep[N],d[N],vis[N],cnt,f[N],root;
int n,m,k;
void add(int u,int v,int z){
	e[++cnt].nxt=head[u];
	head[u]=cnt;
	e[cnt].to=v;
	e[cnt].w=z;
}
void get_root(int u,int father){
	size[u]=1;
	f[u]=0;
	for(int i=head[u];i;i=e[i].nxt){
		int v=e[i].to;
		if(v!=father&&!vis[v]){
			get_root(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 get_dep(int u,int fa){
	dep[++dep[0]]=d[u];
	for(int i=head[u];i;i=e[i].nxt){
		int v=e[i].to;
		if(v!=fa&&!vis[v]){
			d[v]=d[u]+e[i].w;
			get_dep(v,u);
		}
	}
}
int ans[maxn];
int get_sum(int u,int dis,int w){
	d[u]=dis;
	dep[0]=0;
	get_dep(u,0);
	for(int i=1;i<=dep[0];i++){
		for(int j=1;j<=dep[0];j++){
			if(i!=j){
				ans[dep[i]+dep[j]]+=w;
			}
		}
	}
}
void solve(int u){
	get_sum(u,0,1);
	vis[u]=1;
	for(int i=head[u];i;i=e[i].nxt){
		int v=e[i].to;
		if(!vis[v]){
			get_sum(v,e[i].w,-1);
			root=0;	
			f[root]=n;
			S=size[v];
			get_root(v,u);
			solve(root);
		}
	}
}
int main(){
	freopen("test.in","r",stdin);
	freopen("test.out","w",stdout);
	scanf("%d %d",&n,&m);
	int a,b,c;
	for(int i=1;i<n;i++){
		scanf("%d %d %d",&a,&b,&c);
		add(a,b,c);
		add(b,a,c);
	}
	S=n;
	root=0,f[0]=n;
	get_root(1,0);
	solve(root);
	for(int i=1;i<=m;i++){
		scanf("%d",&k);
		if(ans[k]){
			printf("AYE\n");
		}else{
			printf("NAY\n");
		}
	}
	
	return 0;
}
2021/11/12 09:50
加载中...