点分治95pts求助
查看原帖
点分治95pts求助
488310
wisdua楼主2022/8/13 16:53

rt,求助大佬

#18 WA

#include<iostream>
#include<algorithm>
using namespace std;
#define int long long
const int maxn=2e5+1;
int n,k;
struct ed{
	int t,h,w;
}e[maxn<<1];
int last[maxn],cnt=0;
void adde(int x,int y,int z){
	e[++cnt].h=last[x];
	e[cnt].t=y;
	e[cnt].w=z;
	last[x]=cnt;
}
int siz[maxn],root,minn,d[maxn],len[maxn],top[maxn],t[maxn],tp,tot,ans=0x7ffffff;
bool vis[maxn];
void get_root(int u,int f,int sn){
	siz[u]=1;
	int maxx=0;
	for(int i=last[u];i;i=e[i].h){
		int v=e[i].t;
		if(vis[v]||v==f)continue;
		get_root(v,u,sn);
		siz[u]+=siz[v];
		maxx=max(maxx,siz[v]);
	}
	maxx=max(maxx,sn-siz[u]);
	if(maxx<minn){
		minn=maxx;
		root=u;
	}
}
void get_dis(int u,int f){
//	cout<<u<<endl;
	t[++tot]=u;
	top[u]=tp;
	len[u]=len[f]+1;
	for(int i=last[u];i;i=e[i].h){
		int v=e[i].t;
		if(v==f||vis[v])continue;
		if (d[u]+e[i].w>k)return;
		d[v]=d[u]+e[i].w;
		get_dis(v,u);
	}
}
bool cmp(int x,int y){
	if(d[x]==d[y]){
		return len[x]<len[y];
	}
	return d[x]<d[y];
}
void calc(int u){
	tot=0,d[u]=0,top[u]=u,t[++tot]=u,len[u]=0;
	for(int i=last[u];i;i=e[i].h){
		int v=e[i].t;
		if(vis[v])continue;
		tp=v,d[v]=e[i].w;
		len[v]=1;
		get_dis(v,u);
	}
	int l=1,r=tot;
	sort(t+1,t+tot+1,cmp);
	while(l<r){
//		cout<<l<<' '<<r<<endl;
		if(d[t[l]]+d[t[r]]<k){
			l++;
		}else if(d[t[l]]+d[t[r]]>k){
			r--;
		}else if(top[t[l]]==top[t[r]]){
			if(d[t[r]]-d[t[r-1]]<=d[t[l+1]]-d[t[l]])r--;
			else l++;
		}else{
			ans=min(ans,len[t[l]]+len[t[r]]);
			if(d[t[r]]-d[t[r-1]]<=d[t[l+1]]-d[t[l]])r--;
			else l++;
		}
	}
}
void dfs(int u){
	vis[u]=1;
	calc(u);
	for(int i=last[u];i;i=e[i].h){
		int v=e[i].t;
		if(vis[v])continue;
		minn=0x7ffffff;
		get_root(v,u,siz[v]);
		dfs(root);
	}
}
signed main(){
	cin>>n>>k;
	for(int i=1,x,y,z;i<n;i++){
		cin>>x>>y>>z;
		adde(x+1,y+1,z);
		adde(y+1,x+1,z);
	}
	minn=0x7ffffff;
	get_root(1,0,n);
	dfs(root);
	if(ans==0x7ffffff){
		cout<<-1;
	}else cout<<ans;
	return 0;
}
2022/8/13 16:53
加载中...