题目大意:给定一棵树,令一个点到全部点的距离与点权的乘积之和为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':' ');
}
+

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. [已解决]使用 apt-get update 命令提示 ...中被配置了多次

    报错:W: 目标 Sources (main/source/Sources) 在 /etc/apt/sources.list:2 和 /etc/apt/sources.list:7 中被配置了多次 v ...

  2. HTTP重定向

    404 Not Found301 Moved Permanently302 Found500 Internal Server ErrorHTTP重定向就是通过301和302两种状态码来实现的. 302 ...

  3. 【mysql优化 3】嵌套循环连接算法

    原文地址:Nested-Loop Join Algorithms mysql在表之间执行连接操作,包括了使用循环嵌套算法或者其他在此基础上的变形. 循环嵌套连接算法: 一个简单的嵌套循环连接(NLJ: ...

  4. hdu6078[优化递推过程] 2017多校4

    这道题一眼看过去好像和最长公共子序列有点像. 一开始只想到暴力的推法, 令dp[i][j][k]表示 a[i]=b[j](即以ai,bj为结尾的波浪序列的方案数), 且最终状态为k(0,1分别代表下降 ...

  5. formData使用总结

    1.formData基本使用 //可以从form元素初始化一个FormData对象,或者new一个空对象 var formData = new FormData([fromElement]); //可 ...

  6. CORS跨域请求总结

    CORS跨域请求分为简单请求和复杂请求. 1. 简单请求: 满足一下两个条件的请求. (1) 请求方法是以下三种方法之一: HEAD GET POST (2)HTTP的头信息不超出以下几种字段: Ac ...

  7. ie下table无法设置宽度的坑,解决方案:在td里面添加div把td宽度撑开即可。

    <td><div style="width:180px"> <a data-b="2" class="btn btn-s ...

  8. VS2010 + winxp 无法定位程序输入点GetTickCount64 在动态链接库kernel32.dll上 错误

    winxp系统,使用VS2010, 在使用boost中的thread中的sleep的时候出现 “无法定位程序输入点GetTickCount64 在动态链接库kernel32.dll上”的错误, 在网上 ...

  9. System and method for cache management

    Aspects of the invention relate to improvements to the Least Recently Used (LRU) cache replacement m ...

  10. ubuntu16.04下安装wine1.8.2

    如果是amd64则需要执行这个: sudo dpkg --add-architecture i386 1 1 添加wine最新的源 sudo add-apt-repository ppa:wine/w ...