记录编号 390584 评测结果 AAAAATTTTT
题目名称 [POJ1741][男人八题]树上的点对 最终得分 50
用户昵称 GravatarGo灬Fire 是否通过 未通过
代码语言 C++ 运行时间 5.359 s
提交时间 2017-04-03 14:29:11 内存使用 47.05 MiB
显示代码纯文本
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
#define LL long long
#define Inf 2e9
const int maxn=1000050;
char ch;
inline void Read(register int & x){
	while(ch=getchar(),ch<'0' || ch>'9');
	x=ch-48;
	while(ch=getchar(),ch>='0' && ch<='9')x=x*10+ch-48;
}
struct Edge{
	int next,to,dis;
}e[maxn<<1];
int len,head[maxn];
inline void Insert(int x,int y,int z){
	len++;e[len].to=y;e[len].next=head[x];e[len].dis=z;head[x]=len;
}
int n,L;
int RT,sum,size[maxn],Max[maxn];
bool vis[maxn];
inline int bmax(int x,int y){
	if(x>y) return x;
	return y;
}
inline void getroot(int x,int fa){
	size[x]=1;Max[x]=0;
	for(register int i=head[x];i;i=e[i].next){
		int j=e[i].to;
		if(j^fa && !vis[j]){
			getroot(j,x);
			size[x]+=size[j];
			Max[x]=bmax(Max[x],size[j]);
		}
	}
	Max[x]=bmax(Max[x],sum-size[x]);
	if(Max[x]<Max[RT]) RT=x;
}
LL ans=0;
int c[maxn],Tim[maxn],tim;
#define Lowbit(x) (x&(-x))
inline int Query(int x){
	int res=0;
	for(register int i=x;i;i-=Lowbit(i)) {
		if(Tim[i]^tim) {Tim[i]=tim;c[i]=0;}
		res+=c[i];
	}
	return res;
}
inline void Update(register int x,register int add){
	for(register int i=x;i<=L;i+=Lowbit(i)){
		if(Tim[i]^tim){Tim[i]=tim;c[i]=0;}
		c[i]+=add;
	}
}
int nowdep,num[maxn];
inline void Dfs(int x,int fa,int dep){
	if(dep>L) return;
	nowdep=bmax(nowdep,dep);
	num[dep]++;
	for(int i=head[x];i;i=e[i].next){
		if(e[i].to^fa && !vis[e[i].to])
			Dfs(e[i].to,x,dep+e[i].dis);
	}
}
inline void calc(int x){
	tim++;
	Update(1,1);
	register int i,j,k;
	for(i=head[x];i;i=e[i].next){
		j=e[i].to;
		if(vis[j])continue;
		nowdep=0;
		Dfs(j,0,1+e[i].dis);
		for(k=2;k<=nowdep;k++) ans+=(LL)num[k]*Query(L-k+1);
		for(k=2;k<=nowdep;k++) Update(k,num[k]),num[k]=0;
	}
}
inline void Solve(int x){
	vis[x]=true;
	calc(x);
	for(register int i=head[x];i;i=e[i].next){
		int j=e[i].to;
		if(!vis[j]){
			RT=0;sum=size[j];
			getroot(j,0);
			Solve(RT);
		}
	}
}
inline void Init();
int main(){
	freopen("poj1741_tree.in","r",stdin);freopen("poj1741_tree.out","w",stdout);
	while(scanf("%d%d",&n,&L) && L && n)Init();
    getchar();getchar();
    return 0;
}
inline void Init(){
	memset(vis,0,sizeof(vis));
	memset(head,0,sizeof(head));
	len=0;ans=0;
	L++;
	register int i,x,y,z;
	for(i=1;i<n;i++){
		Read(x);Read(y);Read(z);
		Insert(x,y,z);Insert(y,x,z);
	}
	RT=0;Max[RT]=Inf;
	sum=n;
	getroot(1,0);
	Solve(RT);
	printf("%lld\n",ans);
}