求调
  • 板块P4178 Tree
  • 楼主en_en_
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/7/24 16:01
  • 上次更新2024/7/24 16:30:22
查看原帖
求调
1085699
en_en_楼主2024/7/24 16:01
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define Next(i,u) for(int i=head[u];i;i=e[i].nxt)
const int N=1e6;
struct node{
	int v,val,nxt;
}e[N];
int cnt=0,head[N];
int k,n;
void add(int u,int v,int val){
	e[++cnt].v=v;
	e[cnt].val=val;
	e[cnt].nxt=head[u];
	head[u]=cnt;
}
bool vis[N];
int sum,ans;
int dp[N],size[N],root;
void getroot(int u,int fr){
	dp[u]=0,size[u]=1;
	Next(i,u){
		int v=e[i].v;
		if(v==fr||vis[v])continue;
		getroot(v,u);
		size[u]+=size[v];
		dp[u]=max(dp[u],size[v]);
	}
	dp[u]=max(dp[u],sum-size[u]);
	if(dp[u]<dp[root])root=u;
}
int dis[N];
int tot,rev[N];
void getdis(int u,int fr){
	rev[++tot]=dis[u];
	Next(i,u){
		int v=e[i].v;
		if(vis[v]||v==fr)continue;
		dis[v]=dis[u]+e[i].val;
		getdis(v,u);
	}
}
int doit(int u,int w){
	tot=0,dis[u]=w,getdis(u,0);
	sort(rev+1,rev+tot+1);
	int l=1,r=tot,ans=0;
	while(l<=r)(rev[l]+rev[r]<=k)?(ans+=r-l,++l):(--r);
	return ans;
}
void solve(int u){
	vis[u]=1,ans+=doit(u,0);
	Next(i,u){
		int v=e[i].v;
		if(vis[v])continue;
		ans-=doit(v,e[i].val);
		dp[0]=n,sum=size[v],root=0;
		getroot(v,u),solve(root);
	}
}
signed main(){
	int u,w,v;
	cin>>n>>k;
	dp[0]=sum=n;
	for(int i=1;i<=n-1;i++)cin>>u>>v>>w,add(u,v,w),add(v,u,w);
	getroot(1,0),solve(root);
	cout<<ans<<endl;
	return 0;
}

求调

2024/7/24 16:01
加载中...