EOJ Monthly 2017.12 不见了的人口数据 (Hard)

原创 2018年04月16日 15:18:53

题目链接

题意: 一棵树树上节点都有一个值ai,都条边的长度为1,现在知道每个节点的代价值
     为 all 节点t与它的距离即t节点的值积的和pi,问所有的ai的值.(0<=ai<=1000,n<=250000)

p[i]=j=1ndist(i,j)×aj,distijij.

*以前一直觉得是道Guass消元题,但是n有点大,系数矩阵都不能存,更不用说O(n^3)的时间复杂度。今天看了,感觉跟以前做过的树题很相似,细细推导,发觉是道子树的和的技巧题。

*不妨记为root为1的有根树,那么sum[i]表示根为节点i的子树节点值a的和。

p[1]=i=2nsum[i].

uvsum[1]2×sum[v]=p[v]p[u]

因为v为根的子树上的所有节点(包括v)距离u的dist比距离v的dist多1,而非v子树上的点距离u的dist比距离v的dist少1,所有v的代价比u的代价多一颗子树上的值和sum[v],而少非子树上的值和(sum[1]-sum[v])。

所以我们需要做一次DFS,将所有p[son]-fa[fa]之和求出,然后联立第一个公式:得到

(n1)×sum[1]2×p[1]=all(p[son]p[fa]).

sum[1]即解出,在做一个dfs,解出sum[v],然后减去所有回溯的子树权值和,得到了a[v].

#include <iostream>
#include <stdio.h>
#include <string.h>
#include <vector>
#include <algorithm>
#define llt long long
using namespace std;

const int Size=25*1e4+10;
/*
  子树和 技巧题
  以rt为根的子树上所有节点的值的和为 sum[rt]
  所有
*/
vector <int> V[Size];
llt p[Size],sum[Size]={0},a[Size];//sum[1] 表示整棵以1为根的树节点总和;

//求出a1+a2+……+an 先找出所有节点代价与父节点的代价差
llt DFS(int rt,int fa){
    llt tot=0;
    for(int i=0;i<V[rt].size();++i){
        int son=V[rt][i];
        if(fa==son) continue;
        tot+=(p[son]-p[rt])+DFS(son,rt);
    }
    return tot;
}
llt dfs(int rt,int fa){

    if(rt!=1) sum[rt]=(sum[1]+p[fa]-p[rt])/2;
    a[rt]=sum[rt];
    for(int i=0;i<V[rt].size();++i){
        if(V[rt][i]==fa) continue;
        a[rt]-=dfs(V[rt][i],rt);
    }
    return sum[rt];
}
int main(){
    int n;
    scanf("%d",&n);

    for(int i=1;i<n;++i){
        int u,v;
        scanf("%d%d",&u,&v);
        V[u].push_back(v);
        V[v].push_back(u);
    }

    for(int i=1;i<=n;++i)
        scanf("%lld",&p[i]);

    if(n==1){cout<<0<<endl;return 0;}
    sum[1]=(2*p[1]+DFS(1,0))/(n-1);
    dfs(1,0);
    printf("%lld",a[1]);
    for(int i=2;i<=n;++i)
        printf(" %lld",a[i]);
    printf("\n");

    return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_38786088/article/details/79961071

EJB、DCOM、CORBA 三种技术分析

EJB、DCOM、CORBA  ---- 90年代出现的分布式对象技术为网络计算平台上软件的开发提供了强有力的解决方案。目前,分布式对象技术已经成为建立服务应用框架和软件构件的核心技术,在开发大型分布...
  • programlover
  • programlover
  • 2001-10-07 15:49:00
  • 863

EOJ Monthly 2017.12 - F1. 不见了的人口数据 (Easy) (高斯消元)

F1. 不见了的人口数据 (Easy) Time limit per test: 1.0 seconds Memory limit: 256 megabytes 星光镇的...
  • Mr_Treeeee
  • Mr_Treeeee
  • 2017-12-08 22:17:32
  • 182

EOJ Monthly 2017.12 (暨 ECNU 12 月内部选拔)比昨天更多的棒棒糖 (Easy)

题意:一共n元,每天需要买糖果给宝宝吃,且至少大于等于前一天的量,第一天最少为x,问有多少种购买方案。...
  • hmc0411
  • hmc0411
  • 2017-12-08 22:15:38
  • 158

EOJ Monthly 2017.12 G1. 唐纳德与子串 (Easy)

G1. 唐纳德与子串 (Easy) Time limit per test: 1.0 seconds Memory limit: 256 megabytes 子串的定义是在一个字符串中连续出现的...
  • changjiale110
  • changjiale110
  • 2017-12-09 16:18:15
  • 116

EOJ Monthly 2017.12 (暨 ECNU 12 月内部选拔) - A,B,C,G1

这是组队做的一场比赛,也是第一次遇到的全中文的比赛,其中A,G1是最水的题,按题意模拟就行,但是前期忽略了G1,后来才做的,B题是最后A的,D,C也都做了尝试但都没过。 A. 唐纳德先生和假骰子 ...
  • sdau20163942
  • sdau20163942
  • 2017-12-08 21:59:34
  • 397

EOJ Monthly 2017.12 (暨 ECNU 12 月内部选拔) 总结 A B C G1题题解

没想到居然是中文题。。。非常菜,在两道签到题上卡了一个多小时。比赛的时候B题(在哈尔滨的寒风中)居然没做出来,只出了三题,赛后才知道如此简单。。。还是水平不足。以后要更加努力啊。。。下面写一下最简单的...
  • LSD20164388
  • LSD20164388
  • 2017-12-09 13:37:39
  • 92

EOJ Monthly 2017.12 - D. 唐纳德和他的数学老师 (匈牙利算法+质因数)

D. 唐纳德和他的数学老师 Time limit per test: 1.0 seconds Memory limit: 256 megabytes 唐纳德是一个数学天才...
  • Mr_Treeeee
  • Mr_Treeeee
  • 2017-12-08 22:15:04
  • 197

EOJ Monthly 2017.12 - C. 易位构词 (贪心)

C. 易位构词 Time limit per test: 2.0 seconds Memory limit: 256 megabytes 易位构词 (anagram),指...
  • Mr_Treeeee
  • Mr_Treeeee
  • 2017-12-08 22:12:19
  • 173

EOJ Monthly 2017.12 (暨 ECNU 12 月内部选拔) B. 在哈尔滨的寒风中【思维枚举】

B. 在哈尔滨的寒风中Time limit per test: 1.0 secondsMemory limit: 256 megabyteskblack 来到了寒冬中的哈尔滨,哈尔滨的寒风令 kbla...
  • nobleman__
  • nobleman__
  • 2017-12-08 23:32:12
  • 183

E2. 比昨天更多的棒棒糖 (Hard)

http://www.cnblogs.com/hua-dong/p/8011232.html
  • sxy201658506207
  • sxy201658506207
  • 2017-12-10 12:51:08
  • 91
收藏助手
不良信息举报
您举报文章:EOJ Monthly 2017.12 不见了的人口数据 (Hard)
举报原因:
原因补充:

(最多只允许输入30个字)