淀粉质板子P38060pts求条(玄关)
  • 板块学术版
  • 楼主rpyluogu
  • 当前回复2
  • 已保存回复2
  • 发布时间2024/12/9 19:54
  • 上次更新2024/12/9 23:18:09
查看原帖
淀粉质板子P38060pts求条(玄关)
1049376
rpyluogu楼主2024/12/9 19:54

rt,大佬们也可以给一些点分治好题(玄关)

``#include<bits/stdc++.h>
#define int long long
using namespace std;
int sum,n,m,u,v,w,id;
int head[100005],cnt,dp[100005],dis[100005],dis2[100005],q[100005],qu[100005],b[100005],sums,maxp[100005];
bool vis[100005],vis2[10000005];
struct node{
	int to,nxt,w;
}e[200005];
void add(int x,int y,int w){
	e[++cnt].to=y;
	e[cnt].nxt=head[x];
	head[x]=cnt;
	e[cnt].w=w;
}
void dfs1(int x,int pre){
	maxp[x]=0;
	dis[x]=1;
	for(register int i=head[x];i;i=e[i].nxt){
		if(e[i].to==pre||vis[e[i].to]){
			continue;
		}
		dfs1(e[i].to,x);
		dis[x]+=dis[e[i].to];
		maxp[x]=max(maxp[x],dis[e[i].to]+1);
	}
	maxp[x]=max(maxp[x],sums-dis[x]-1);
	if(maxp[x]<maxp[id]){
		id=x;
	}
}
void dfs2(int x,int pre){
	dp[++dp[0]]=dis2[x];
	for(register int i=head[x];i;i=e[i].nxt){
		if(e[i].to==pre||vis[e[i].to]){
			continue;
		}
		dis2[e[i].to]=dis2[x]+e[i].w;
		dfs2(e[i].to,x);
	}
}
void solve(int rt){
	vis[rt]=1;
	vis2[0]=1;
	int pos=0;
	for(register int i=head[rt];i;i=e[i].nxt){
		if(vis[e[i].to]){
			continue;
		}
		dp[0]=0;
		dis2[e[i].to]=e[i].w;
		dfs2(e[i].to,rt);
		for(register int j=dp[0];j;j--){
			for(register int k=1;k<=m;k++){
				if(q[k]>=dp[j]){
					if(vis2[q[k]-dp[j]]){
						qu[k]=1;
					}
				}
			}
		}
		for(register int j=dp[0];j;j--){
			vis2[dp[j]]=1;
			b[++pos]=dp[j];
		}
	}
	for(register int i=1;i<=pos;i++){
		vis2[dp[i]]=0;
	}
	for(register int i=head[rt];i;i=e[i].nxt){
		if(vis[e[i].to]){
			continue;
		}
		id=0;
		maxp[0]=1e9;
		sums=dis[e[i].to];
		dfs1(e[i].to,0);
		solve(id);
	}
}
signed main(){
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	cin>>n>>m;
	for(register int i=1;i<=n-1;i++){
		cin>>u>>v>>w;
		add(u,v,w);
		add(v,u,w);
	}
	for(register int i=1;i<=m;i++){
		cin>>q[i];
	}
	id=0,maxp[0]=1e9;sum=n;
	dfs1(1,0);
	solve(id);
	for(register int i=1;i<=m;i++){
		if(qu[i]){
			cout<<"AYE"<<'\n';
		}
		else{
			cout<<"NAY"<<'\n';
		}
	}
	return 0;
}
2024/12/9 19:54
加载中...