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;
    }
    
  • 相关阅读:
    Vsftpd 3.0.2 正式版发布
    Putdb WebBuilder 6.5 正式版本发布
    SoaBox 1.1.6 GA 发布,SOA 模拟环境
    pynag 0.4.6 发布,Nagios配置和插件管理
    Percona Playback 0.4,MySQL 负荷回放工具
    xombrero 1.3.1 发布,微型 Web 浏览器
    Hypertable 0.9.6.4 发布,分布式数据库
    libmemcached 1.0.11 发布
    CryptoHeaven 3.7 发布,安全邮件解决方案
    Android Activity生命周期
  • 原文地址:https://www.cnblogs.com/NLDQY/p/11117911.html
Copyright © 2011-2022 走看看