淀粉质 WA on #7 #15 求调
查看原帖
淀粉质 WA on #7 #15 求调
758264
Motonic_queues楼主2025/2/7 20:07
#include<bits/stdc++.h>
#define int long long
using namespace std;

int n,rt,m,k;
int sz[200005],dp[200005],dis[200005],dep[200005],tot,all,res=1e9;
int ask[105],pmt[200005];
unordered_map<int,int> exs;
bool vis[200005],ans[10];
vector<pair<int,int> > e[200005];
pair<int,int> ddis[200005];

void find_rt(int fat,int p){
	dp[p]=0;
	sz[p]=1;
	for(auto q:e[p]){
		int to=q.first;
		if(to==fat||vis[to])continue;
		find_rt(p,to);
		sz[p]+=sz[to];
		dp[p]=max(dp[p],sz[to]);
	}
	dp[p]=max(dp[p],all-sz[p]);
	if(dp[p]<dp[rt])rt=p;
}

void getdis(int p,int fat){
	ddis[++tot]={dis[p],p};
	for(auto q:e[p]){
		int to=q.first,val=q.second;
		if(to==fat||vis[to])continue;
		dis[to]=dis[p]+val;
		dep[to]=dep[p]+1;
		getdis(to,p);
	}
}

void calc(int p){
	int otto=0;
	for(auto q:e[p]){
		int to=q.first,val=q.second;
		if(vis[to])continue;
		tot=0;
		dis[to]=val;
		dep[to]=1;
		getdis(to,p);
		for(int i=tot;i;i--){
			for(int j=1;j<=m;j++){
				if(ask[j]>=ddis[i].first){
					ans[j]|=(exs[ask[j]-ddis[i].first]>0);
					if(exs[ask[j]-ddis[i].first]){
						res=min(res,dep[ddis[i].second]+dep[exs[ask[j]-ddis[i].first]]);
					}
				}
			}
		}
		for(int i=tot;i;i--){
			pmt[++otto]=ddis[i].first,exs[ddis[i].first]=ddis[i].second;
		}
	}
	for(int i=otto;i;i--)exs[pmt[i]]=0;
}

void solve(int p){
	vis[p]=exs[0]=1;
	calc(p);
	for(auto q:e[p]){
		int to=q.first;
		if(vis[to])continue;
		all=sz[to];
		dp[rt=0]=1e9;
		find_rt(0,to);
		solve(rt);
	}
}

signed main(){
//	freopen("P4149_7.in","r",stdin);
	cin>>n>>k;
	for(int i=1;i<n;i++){
		int u,v,w;
		cin>>u>>v>>w;u++,v++;
		e[u].push_back({v,w});
		e[v].push_back({u,w});
	}
	m=1,ask[1]=k;
	all=n;
	dp[rt=0]=n;
	find_rt(0,1);
	solve(rt);
	cout<<(ans[1]?res:-1);
	return 0;
}	
2025/2/7 20:07
加载中...