题目大意:给定一棵树,令一个点到全部点的距离与点权的乘积之和为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就知道 那是逗你的……

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define M 300300
using namespace std;
typedef long long ll;
typedef pair<ll,ll> abcd;
struct edge{
int to,next;
}table[M<<1];
int head[M],tot;
int n,ans,fa[M],dis[M];
ll a[M],b[M];
abcd double_size[M],double_a[M],b_1;
void Add(int x,int y)
{
table[++tot].to=y;
table[tot].next=head[x];
head[x]=tot;
}
abcd operator += (abcd &x,const abcd &y)
{
x.first+=y.first;
x.second+=y.second;
}
void operator -= (abcd &x,const abcd &y)
{
x.first-=y.first;
x.second-=y.second;
}
abcd operator * (const abcd &x,int y)
{
return abcd( x.first * y , x.second * y );
}
void BFS()
{
static int q[M],r,h;
int i;
q[++r]=1;
while(r!=h)
{
int x=q[++h];
for(i=head[x];i;i=table[i].next)
if(table[i].to!=fa[x])
{
fa[table[i].to]=x;
dis[table[i].to]=dis[x]+1;
q[++r]=table[i].to;
}
}
}
int main()
{
int i,x,y;
cin>>n;
for(i=1;i<n;i++)
scanf("%d%d",&x,&y),Add(x,y),Add(y,x);
for(i=1;i<=n;i++)
scanf("%d",&b[i]);
BFS();
for(i=2;i<=n;i++)
double_size[i]=abcd(1,b[fa[i]]-b[i]);
for(x=2;x<=n;x++)
{
double_a[x]=double_size[x];
for(i=head[x];i;i=table[i].next)
if(table[i].to!=fa[x])
double_a[x]-=double_size[table[i].to];
b_1+=double_a[x]*dis[x];
}
ans=(b[1]+b[1]-b_1.second)/b_1.first;
a[1]=ans;
for(i=2;i<=n;i++)
{
a[i]=double_a[i].first*ans+double_a[i].second>>1;
a[1]-=a[i];
}
for(i=1;i<=n;i++)
printf("%lld%c",a[i],i==n?'\n':' ');
}
+

最新文章

  1. Linux系统的理解及学习Linux内核的心得
  2. poj1700-Crossing River(贪心算法)
  3. 使用PHP的正则抓取页面中的网址
  4. 给java应用打包
  5. linux学习笔记二-----文件权限管理
  6. Android与服务器http连接模块代码
  7. display:none,overflow:hidden,visibility:hidden之间的区别
  8. KMP--路过
  9. Codeforces Round #272 (Div. 2) D. Dreamoon and Sets (思维 数学 规律)
  10. Python进阶 - 命名空间与作用域
  11. java中模拟http(https)请求的工具类
  12. 什么是web service ?
  13. GL-inet路由器当主控制作WIFI视频小车
  14. CSS控制文字显示一行,超出显示省略号
  15. [20180819]关于父子游标问题(11g).txt
  16. AtCoder Regular Contest 063 F : Snuke’s Coloring 2 (线段树 + 单调栈)
  17. 使用Solrj 获取语句分词结果的代码
  18. iptables做端口转发
  19. spring boot学习(7) SpringBoot 之表单验证
  20. frm和ibd恢复sql文件的操作

热门文章

  1. 九度oj 题目1496:数列区间
  2. HDU-3592 World Exhibition
  3. Spark2.1.0之源码分析——事件总线
  4. setsockopt等高级使用
  5. 【bzoj1717】[Usaco2006 Dec]Milk Patterns 产奶的模式 SA+二分
  6. SyntaxError: Non-UTF-8 code starting with &#39;\xb4&#39;...
  7. poj 2079 Triangle
  8. linux内核栈与用户栈【转】
  9. Linux 之 LNMP服务器搭建-PHP
  10. C# Array类的浅复制Clone()与Copy()的区别