• 点分治模板 POJ 1741


    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    const int maxn=1e6+5;
    struct asd{
    	int from,to,next,val;
    }b[maxn];
    int head[maxn],tot=1;
    void ad(int aa,int bb,int cc){
    	b[tot].from=aa;
    	b[tot].to=bb;
    	b[tot].val=cc;
    	b[tot].next=head[aa];
    	head[aa]=tot++;
    }
    int n,k,ans,Tsiz,Root;
    int siz[maxn],wt[maxn],a[maxn];
    bool vis[maxn];
    int cnt;
    void get_root(int now,int fa){
    	siz[now]=1;
    	wt[now]=0;
    	for(int i=head[now];i!=-1;i=b[i].next){
    		int u=b[i].to;
    		if(vis[u] || u==fa) continue;
    		get_root(u,now);
    		siz[now]+=siz[u];
    		wt[now]=max(wt[now],siz[u]);
    	}
    	wt[now]=max(wt[now],Tsiz-siz[now]);
    	if(wt[Root]>wt[now]) Root=now;
    	//printf("Root=%d
    ",Root);
    }
    void dfs(int now,int fa,int d){
    	a[++cnt]=d;
    	//printf("%d %d
    ",now,a[cnt]);
    	for(int i=head[now];i!=-1;i=b[i].next){
    		int u=b[i].to;
    		//printf("%d %d
    ",now,cnt);
    		if(u!=fa && !vis[u]) dfs(u,now,d+b[i].val);
    	}
    }
    int js(int now,int d){
    	cnt=0;
    	dfs(now,0,d);
    	sort(a+1,a+cnt+1);
    	/*for(int i=1;i<=cnt;i++){
    		printf("%d %d
    ",now,a[i]);
    	}*/
    	//printf("now=%d cnt=%d
    ",now,cnt);
    	int sum=0;
    	for(int i=1,j=cnt;;i++){
    		//printf("now=%d a[%d]=%d a[%d]=%d
    ",now,i,a[i],j,a[j]);
    		while(j && a[i]+a[j]>k) j--;
    		if(i>j) break;
    		sum+=j-i+1;
    	}
    	//printf("sum=%d
    ",sum);
    	return sum;
    }
    void dfss(int now){
    	//printf("ans=%d
    ",ans);
    	ans+=js(now,0);
    	vis[now]=1;
    	for(int i=head[now];i!=-1;i=b[i].next){
    		int u=b[i].to;
    		if(!vis[u]){
    			ans-=js(u,b[i].val);
    			Root=0;
    			Tsiz=siz[u];
    			get_root(u,0);
    			dfss(Root);
    		}
    	}
    }
    int main(){
    	while(scanf("%d%d",&n,&k)!=EOF && n){
    		ans=0;
    		tot=1;
    		memset(head,-1,sizeof(head));
    		memset(&b,0,sizeof(struct asd));
    		memset(vis,0,sizeof(vis));
    		for(int i=1;i<n;i++){
    			int aa,bb,cc;
    			scanf("%d%d%d",&aa,&bb,&cc);
    			ad(aa,bb,cc),ad(bb,aa,cc);
    		}
    		wt[0]=0x3f3f3f3f;
    		Root=0;
    		Tsiz=n;
    		get_root(1,0);
    		//printf("Root=%d
    ",Root);
    		dfss(Root);
    		printf("%d
    ",ans-n);
    	}
    	return 0;
    }
    
  • 相关阅读:
    json 轻解读 转
    android file.mkdir()
    iOS摄像头采集和编码
    对安装React脚手架出错的情况做以详解
    DNGuard Enterprise v2.95 released
    DNGuard Enterprise v3.2 released
    DNGuard 专业版 v2.95 发布
    DNGuard 企业版 v3.1 发布
    Windows 2003 上使用 Windows Live Writer
    .Net 中枚举AppDomains
  • 原文地址:https://www.cnblogs.com/liuchanglc/p/13023719.html
Copyright © 2020-2023  润新知