题目大意:给定一棵树,令一个点到全部点的距离与点权的乘积之和为b[i]。求每一个点的权值a[i]

首先假设给定a[i]我们能够非常轻松的求出b[i] 可是反过来怎么搞?高斯消元?30W?

考虑已知a[i]求b[i]的情况 令这棵树的根为1 点i到根节点的距离为dis[i] 以i为根的子树的a值之和为size[i] 那么有递推式

b[1]=Σa[i]*dis[i]

b[x]=b[fa[x]]-2*size[x]+size[1]

将上式变形得:

2*size[x]=b[fa[x]]-b[x]+size[1]

且显然有

a[x]=size[x]-Σa[son[x]]

我们能够O(n)求出全部a[x]关于size[1]的一次函数关系 然后代入b[1]=Σa[i]*dis[i] 能够得到b[1]关于size[1]的一次函数关系 因为b[1]已知 所以size[1]就搞出来了

然后代入求出a[2]~a[n] 然后用size[1]减掉全部的a[2]~a[n]就是a[1]

别忘了开long long

多解啥的 看到没有Special Judge就知道 那是逗你的……

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<iostream>
  4. #include<algorithm>
  5. #define M 300300
  6. using namespace std;
  7. typedef long long ll;
  8. typedef pair<ll,ll> abcd;
  9. struct edge{
  10. int to,next;
  11. }table[M<<1];
  12. int head[M],tot;
  13. int n,ans,fa[M],dis[M];
  14. ll a[M],b[M];
  15. abcd double_size[M],double_a[M],b_1;
  16. void Add(int x,int y)
  17. {
  18. table[++tot].to=y;
  19. table[tot].next=head[x];
  20. head[x]=tot;
  21. }
  22. abcd operator += (abcd &x,const abcd &y)
  23. {
  24. x.first+=y.first;
  25. x.second+=y.second;
  26. }
  27. void operator -= (abcd &x,const abcd &y)
  28. {
  29. x.first-=y.first;
  30. x.second-=y.second;
  31. }
  32. abcd operator * (const abcd &x,int y)
  33. {
  34. return abcd( x.first * y , x.second * y );
  35. }
  36. void BFS()
  37. {
  38. static int q[M],r,h;
  39. int i;
  40. q[++r]=1;
  41. while(r!=h)
  42. {
  43. int x=q[++h];
  44. for(i=head[x];i;i=table[i].next)
  45. if(table[i].to!=fa[x])
  46. {
  47. fa[table[i].to]=x;
  48. dis[table[i].to]=dis[x]+1;
  49. q[++r]=table[i].to;
  50. }
  51. }
  52. }
  53. int main()
  54. {
  55. int i,x,y;
  56. cin>>n;
  57. for(i=1;i<n;i++)
  58. scanf("%d%d",&x,&y),Add(x,y),Add(y,x);
  59. for(i=1;i<=n;i++)
  60. scanf("%d",&b[i]);
  61. BFS();
  62. for(i=2;i<=n;i++)
  63. double_size[i]=abcd(1,b[fa[i]]-b[i]);
  64. for(x=2;x<=n;x++)
  65. {
  66. double_a[x]=double_size[x];
  67. for(i=head[x];i;i=table[i].next)
  68. if(table[i].to!=fa[x])
  69. double_a[x]-=double_size[table[i].to];
  70. b_1+=double_a[x]*dis[x];
  71. }
  72. ans=(b[1]+b[1]-b_1.second)/b_1.first;
  73. a[1]=ans;
  74. for(i=2;i<=n;i++)
  75. {
  76. a[i]=double_a[i].first*ans+double_a[i].second>>1;
  77. a[1]-=a[i];
  78. }
  79. for(i=1;i<=n;i++)
  80. printf("%lld%c",a[i],i==n?'\n':' ');
  81. }
  82. +

BZOJ 3727 PA2014 Final Zadanie 树形DP的更多相关文章

  1. 【BZOJ3727】PA2014 Final Zadanie 树形DP

    [BZOJ3727]PA2014 Final Zadanie Description 吉丽YY了一道神题,题面是这样的:“一棵n个点的树,每条边长度为1,第i个结点居住着a[i]个人.假设在i结点举行 ...

  2. 【BZOJ 3727】 3727: PA2014 Final Zadanie (递推)

    3727: PA2014 Final Zadanie Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 279  Solved: 121 Descript ...

  3. [BZOJ 4033] [HAOI2015] T1 【树形DP】

    题目链接:BZOJ - 4033 题目分析 使用树形DP,用 f[i][j] 表示在以 i 为根的子树,有 j 个黑点的最大权值. 这个权值指的是,这个子树内部的点对间距离的贡献,以及 i 和 Fat ...

  4. [BZOJ 4455] [ZJOI 2016] 小星星 (树形dp+容斥原理+状态压缩)

    [BZOJ 4455] [ZJOI 2016] 小星星 (树形dp+容斥原理+状态压缩) 题面 给出一棵树和一个图,点数均为n,问有多少种方法把树的节点标号,使得对于树上的任意两个节点u,v,若树上u ...

  5. BZOJ 2286 消耗战 (虚树+树形DP)

    给出一个n节点的无向树,每条边都有一个边权,给出m个询问,每个询问询问ki个点,问切掉一些边后使得这些顶点无法与顶点1连接.最少的边权和是多少.(n<=250000,sigma(ki)<= ...

  6. BZOJ 3721: PA2014 Final Bazarek

    3721: PA2014 Final Bazarek Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 645  Solved: 261[Submit][ ...

  7. BZOJ 2435 道路修建 NOI2011 树形DP

    一看到这道题觉得很水,打了递归树形DP后RE了一组,后来发现必须非递归(BFS) 递归版本84分: #include<cstdio> #include<cstring> #in ...

  8. BZOJ 2878: [Noi2012]迷失游乐园( 树形dp )

    一棵树的话直接树形dp(求出往下走和往上走的期望长度). 假如是环套树, 环上的每棵树自己做一遍树形dp, 然后暴力枚举(环上的点<=20)环上每个点跑经过环上的路径就OK了. -------- ...

  9. BZOJ 2314: 士兵的放置( 树形dp )

    树形dp... dp(x, 0)表示结点x不放士兵, 由父亲控制: dp(x, 1)表示结点x不放士兵, 由儿子控制: dp(x, 2)表示结点x放士兵. ---------------------- ...

随机推荐

  1. 添加字段的SQL语句的写法:

    alter table [表名] add [字段名] 字段属性 default 缺省值 default 是可选参 --删除字段   -- alter table  [SolidDB].[dbo].tP ...

  2. [UiAutomator篇][3] 打开音乐应用的测试脚本

    package qq.test; import android.content.Context; import android.content.Intent; import android.suppo ...

  3. [错误处理]UnicodeDecodeError: 'ascii' codec can't decode byte 0xe5 in position 0: ordinal not in range(128)

    Stackoverflow 回答: 将byte类型转化:byte_string.decode('utf-8') Jinja2 is using Unicode internally which mea ...

  4. 移动端(钉钉微服务)webpack配置需要移除hash来解决应用更新后白屏的问题

    钉钉微服务webpack配置调整方案 1: Vue CLI配置修改方法 a. 修改build下webpack.prod.config.js.去掉图中三处hash(.[chunkhash]): b. 修 ...

  5. 【Luogu】P2515软件安装(树形DP)

    题目链接 这么水的题我一遍没A,而且前两次提交都只有十分.气死我了.本来我的博客拒收水题来着. Tarjan缩点之后跑树形DP即可. #include<cstdio> #include&l ...

  6. IE7中a标签包含img,点击img,链接失效的bug

    在做列表时,我们经常会这样写: <ul class="works-list"> <li> <a href=""> <d ...

  7. SharePoint 2013 SSO-Secure Store Service在实际案例中的应用

    文章目录: Secure Store Service介绍 Secure Store Service部署 Secure Store Service应用 之前有一篇博客讲到使用EMSManagedAPI操 ...

  8. 【CF1028A】Find Square(签到)

    题意:给定矩阵里,找到由B构成的矩形的中心 n,m<=115 思路: #include<cstdio> #include<cstring> #include<str ...

  9. StarUML 系列,静态图与动态图,用例图,类图【ps:熟悉一下starUML】

    大部分:   静态图部分,即静态不动的图 1.用例图, Use case diagram 1.展示系统核心功能及与其交互的用户ACTOR 表示:椭圆

  10. Android 中图可以用到的图片处理类 BitmapUtils

    Android在实际开发中很多时候都要对图片进行一定的处理,这里总结的BitmapUtils 类包括一下几个功能: 1.Android图片倒影, 2.Android图片模糊处理, 3.Android图 ...