桶做法,#7 不是 TLE 就是 RE 帮忙卡一下
查看原帖
桶做法,#7 不是 TLE 就是 RE 帮忙卡一下
661044
_saltFish_楼主2022/9/3 13:59

卡了好久了,就是没法过,qwq。

求大佬帮忙卡一下。

#include<iostream>
using namespace std;
const int N(1e5+5);
int n,m;
int h[N],to[N<<1],nxt[N<<1],tot,val[N<<1];
inline void add(int x,int y,int w){
	nxt[++tot]=h[x],to[h[x]=tot]=y,val[tot]=w;
	nxt[++tot]=h[y],to[h[y]=tot]=x,val[tot]=w;
}
int root,siz[N],dp[N]={0x7fffffff};
int sum,stk[N],top,ans[200000005];
bool vis[N];
void getroot(int u,int f){
	siz[u]=1;dp[u]=0;
	for(int i=h[u];i;i=nxt[i]){
		int v=to[i];
		if(vis[v]||v==f) continue;
		getroot(v,u);
		siz[u]+=siz[v];
		dp[u]=max(dp[u],siz[v]);
	}
	dp[u]=max(dp[u],sum-siz[u]);
	if(dp[u]<dp[root]) root=u;
}
void getdis(int u,int f,int dis){
	stk[++top]=dis;
	for(int i=h[u];i;i=nxt[i]){
		int v=to[i];
		if(vis[v]||v==f) continue;
		getdis(v,u,dis+val[i]);
	}
}
void solve(int rt,int dis,int op){
	top=0;
	getdis(rt,0,dis);
	for(int i=1;i<=top;i++)
		for(int j=i+1;j<=top;j++)
			ans[stk[i]+stk[j]]+=op;
}
void divide(int u){
	vis[u]=1;
	solve(u,0,1);
	for(int i=h[u];i;i=nxt[i]){
		int v=to[i];
		if(vis[v]) continue;
		solve(v,val[i],-1);
		root=0;sum=siz[u];
		getroot(v,u);
		divide(root);
	}
}
int main(){
	#ifdef ytxy
	freopen("in.txt","r",stdin);
	#endif
    ios::sync_with_stdio(0);
    cin.tie(0),cout.tie(0);
    cin>>n>>m;
    for(int i=1;i<n;i++){
    	int u,v,w;
    	cin>>u>>v>>w;
    	add(u,v,w);
	}
	root=0;sum=n;
	getroot(1,0);divide(root);
	while(m--){
		int k;
		cin>>k;
		cout<<((ans[k]>0)?"AYE":"NAY")<<'\n';
	}
}
2022/9/3 13:59
加载中...