zoukankan      html  css  js  c++  java
  • [USACO12FEB]附近的牛Nearby Cows

    题目链接:QAQ

    题目大意:给出一棵n个点的树,每个点上有(C_i)头牛,问每个点k步范围内各有多少头牛。

    Solution:

    首先看看数据范围,(nle1e5,kle20),那我们可以尝试设(f[n][k])

    (d[i][j])表示从i点开始向下k的范围内有多少头牛,(f[i][j])代表从i点开始j范围内有多少头牛

    (d[i][j])可以很容易算出来,对于一个点(u),(d[u][j]=C_u+sum_{vin son_u}d[v][j-1])

    (f[i][j])也可以得出,(f[v][j]=f[fa[v]][j-1]-d[v][j-2]+d[v][j])

    最后输出(f[i][k])就行了

    Code:

    #include<bits/stdc++.h>
    using namespace std;
    const int N=1e5+1;
    int n,k,cnt,head[N];
    int a[N],d[N][21],f[N][21];
    struct Edge{int nxt,to;}edge[N<<1];
    void ins(int x,int y){
    	edge[++cnt].nxt=head[x];
    	edge[cnt].to=y;head[x]=cnt;
    }
    void dfs(int x,int fa,int u){
    	d[x][u]+=a[x];
    	for(int i=head[x];i;i=edge[i].nxt){
    		int y=edge[i].to;
    		if(y==fa) continue;
    		d[x][u]+=d[y][u-1];
    		dfs(y,x,u);
    	}
    }
    void calc(int x,int fa,int u){
    	int w=u-2>=0?d[x][u-2]:0;
    	f[x][u]=f[fa][u-1]-w+d[x][u];
    	for(int i=head[x];i;i=edge[i].nxt)
    		if(edge[i].to!=fa) calc(edge[i].to,x,u);
    }
    void work(int u){
    	for(int i=head[1];i;i=edge[i].nxt)
    		calc(edge[i].to,1,u);
    }
    int read(){
    	int x=0,f=1;char ch=getchar();
    	while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}
    	while(isdigit(ch)){x=x*10+ch-48;ch=getchar();}
    	return x*f;
    }
    int main(){
    	n=read(),k=read();
    	for(int i=1;i<n;i++){
    		int x=read(),y=read();
    		ins(x,y),ins(y,x);
    	}
    	for(int i=1;i<=n;i++)
    		a[i]=read(),d[i][0]=a[i];
    	if(!k){
    		for(int i=1;i<=n;i++)
    			printf("%d
    ",a[i]);
    		return 0;
    	}
    	for(int i=1;i<=k;i++) dfs(1,0,i),f[1][i]=d[1][i];
    	for(int i=1;i<=n;i++) f[i][0]=a[i];
    	for(int i=1;i<=k;i++) work(i);
    	for(int i=1;i<=n;i++) printf("%d
    ",f[i][k]);
    	return 0;
    }
    
  • 相关阅读:
    学习之路五:再议自定义时钟类(跨线程间的访问操作) → 异步操作
    学习之路七:一步一步学习ASP.NET数据绑定
    走进单元测试五:单元测试文章系列目录
    迷茫后的感悟
    学习之路八:解决不能调试服务端代码的问题
    asp.net not found
    java内部类
    DEBUG&TRACE
    Lambda表达式
    基于事件的异步模式
  • 原文地址:https://www.cnblogs.com/NLDQY/p/11117911.html
Copyright © 2011-2022 走看看