bzoj 3727: Final Zadanie 思维题
题目:
Description
吉丽YY了一道神题,题面是这样的:
“一棵n个点的树,每条边长度为1,第i个结点居住着a[i]个人。假设在i结点举行会议,所有人都从原住址沿着最短路径来到i结点,行走的总路程为b[i]。输出所有b[i]。”
吉丽已经造好了数据,但熊孩子把输入文件中所有a[i]给删掉了。你能帮他恢复吗?
题解:
对于节点\(u\)设其父亲为\(fa_u\).子树的\(a_i\)之和为\(sum_i\)
设\(SUM = \sum_{u \in G}a_u\)
则对于任意的\(u \neq 1\)有:\(b_u - b_{fa_u} = SUM - 2*sum_u\)
且\(b_1 = \sum_{u \neq 1}sum_u\)
然后我们将所有的\(b_u - b_{fa_u} = SUM - 2*sum_u\)求和
得:\(\sum (b_u - b_{fa_u}) = (n-1)*SUM - 2\sum_{u \neq 1}sum_u\)
我们将\(b_1 = \sum_{u \neq 1}sum_u\)翻倍加上去有.
\(2*b_1 = \sum (b_u - b_{fa_u}) = (n-1)*SUM\)
于是我们有:\(SUM = \frac{2*b_1 + \sum_{u \neq 1}(b_u - b_{fa_u})}{n-1}\)
既然我们得到了SUM,那么将其代入到所有的\(b_u - b_{fa_u} = SUM - 2*sum_u\)中即可
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long ll;
inline void read(int &x){
x=0;char ch;bool flag = false;
while(ch=getchar(),ch<'!');if(ch == '-') ch=getchar(),flag = true;
while(x=10*x+ch-'0',ch=getchar(),ch>'!');if(flag) x=-x;
}
const int maxn = 300010;
int n;
struct Egde{
int to,next;
}G[maxn<<1];
int head[maxn],cnt;
void add(int u,int v){
G[++cnt].to = v;
G[cnt].next = head[u];
head[u] = cnt;
}
int b[maxn],sum[maxn],fa[maxn],a[maxn];
#define v G[i].to
void dfs1(int u){
for(int i = head[u];i;i=G[i].next){
if(v == fa[u]) continue;
fa[v] = u;dfs1(v);
}
}
void dfs2(int u){
a[u] = sum[u];
for(int i = head[u];i;i=G[i].next){
if(v == fa[u]) continue;
dfs2(v);a[u] -= sum[v];
}
}
#undef v
inline void init(){
memset(head,0,sizeof head);
cnt = 0;
}
int main(){
init();read(n);
for(int i=1,u,v;i<n;++i){
read(u);read(v);
add(u,v);add(v,u);
}
memset(sum,0,sizeof sum);
memset(fa,0,sizeof fa);
for(int i=1;i<=n;++i) read(b[i]);
dfs1(1);
ll x = 0;
for(int i=2;i<=n;++i){
x += b[i] - b[fa[i]];
}x += 2LL*b[1];
ll SUM = x/(n-1);
sum[1] = SUM;
for(int i=2;i<=n;++i){
sum[i] = SUM - (b[i] - b[fa[i]]);
sum[i] >>= 1;
}
dfs2(1);
for(int i=1;i<=n;++i){
printf("%d",a[i]);
if(i != n) putchar(' ');
else putchar('\n');
}
return 0;
}
bzoj 3727: Final Zadanie 思维题的更多相关文章
- 【BZOJ 3727】 3727: PA2014 Final Zadanie (递推)
3727: PA2014 Final Zadanie Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 279 Solved: 121 Descript ...
- HDU 1029 Ignatius and the Princess IV / HYSBZ(BZOJ) 2456 mode(思维题,~~排序?~~)
HDU 1029 Ignatius and the Princess IV (思维题,排序?) Description "OK, you are not too bad, em... But ...
- 计蒜客 28319.Interesting Integers-类似斐波那契数列-递推思维题 (Benelux Algorithm Programming Contest 2014 Final ACM-ICPC Asia Training League 暑假第一阶段第二场 I)
I. Interesting Integers 传送门 应该是叫思维题吧,反正敲一下脑壳才知道自己哪里写错了.要敢于暴力. 这个题的题意就是给你一个数,让你逆推出递推的最开始的两个数(假设一开始的两个 ...
- BZOJ 2734 洛谷 3226 [HNOI2012]集合选数【状压DP】【思维题】
[题解] 思维题,看了别人的博客才会写. 写出这样的矩阵: 1,3,9,... 2,6,18,... 4,12.36,... 8,24,72,... 我们要做的就是从矩阵中选出一些数字,但是不能选相邻 ...
- UVA 1394 And Then There Was One / Gym 101415A And Then There Was One / UVAlive 3882 And Then There Was One / POJ 3517 And Then There Was One / Aizu 1275 And Then There Was One (动态规划,思维题)
UVA 1394 And Then There Was One / Gym 101415A And Then There Was One / UVAlive 3882 And Then There W ...
- 【BZOJ3727】PA2014 Final Zadanie 树形DP
[BZOJ3727]PA2014 Final Zadanie Description 吉丽YY了一道神题,题面是这样的:“一棵n个点的树,每条边长度为1,第i个结点居住着a[i]个人.假设在i结点举行 ...
- CodeForces - 631C ——(思维题)
Each month Blake gets the report containing main economic indicators of the company "Blake Tech ...
- zoj 3778 Talented Chef(思维题)
题目 题意:一个人可以在一分钟同时进行m道菜的一个步骤,共有n道菜,每道菜各有xi个步骤,求做完的最短时间. 思路:一道很水的思维题, 根本不需要去 考虑模拟过程 以及先做那道菜(比赛的时候就是这么考 ...
- cf A. Inna and Pink Pony(思维题)
题目:http://codeforces.com/contest/374/problem/A 题意:求到达边界的最小步数.. 刚开始以为是 bfs,不过数据10^6太大了,肯定不是... 一个思维题, ...
随机推荐
- [CTSC2001]1378 选课
1378 选课 题目描述 学校实行学分制.每门的必修课都有固定的学分,同时还必须获得相应的选修课程学分.学校开设了N(N<300)门的选修课程,每个学生可选课程的数量M是给定的.学生选修了这 ...
- js的new到底干了啥 -
javascript通过new操作符构建一个对象的步骤 <Javascript高级程序设计>的解释: 创建一个对象 将构造函数的作用域赋给新对象(把新对象作为构造函数的调用上下文,也就是t ...
- Nginx教程
Nginx教程 1.背景 介绍 Nginx是一个高性能的HTTP服务器,以及反向代理服务器 组成 Ngnix有内核和模块组成.微结构的内核根据配置文件将一个请求映射到一个location块中,该loc ...
- effect request
from bs4 import BeautifulSoup import os filepath = 'D:\\pymine\\clean\\spider_map\\baidu_map_html_fi ...
- JVM类加载流程
1.加载 a.装载类的第一个阶段 b.取得类的二进制流 c.转为方法区数据结构 d.在Java堆中生成对应的java.lang.Class对象 2.链接 a.验证(保证Class流的格式是正确的) 文 ...
- Swift编程语言学习6—— 闭包
闭包是自包括的函数代码块,能够在代码中被传递和使用. Swift 中的闭包与 C 和 Objective-C 中的代码块(blocks)以及其它一些编程语言中的 lambdas 函数比較类似. 闭 ...
- vim中设置tab的长度的方法
linux下使用vim编程是比較常见的事情,但vim默认的tab是8个空格.但一般的编辑器是4个空格,所以希望改动下.详细方法例如以下:1. 创建文件名称为 .vimrc 的系统文件首先切换到用户根文 ...
- Data Structure Stack: Infix to Postfix
http://geeksquiz.com/stack-set-2-infix-to-postfix/ #include <iostream> #include <vector> ...
- vim打开多个文件方式及操作
格式如下: #vim file*.txt 或者 #vim file file2 file3 查看当前编程的是那个文件,在冒号命令行下 :args 命令,类似:file [file2],以中括号里面为当 ...
- Windows下Nginx的启动、停止等命令添加
Windows下Nginx的启动.停止等命令在Windows下使用Nginx,我们需要掌握一些基本的操作命令,比如:启动.停止Nginx服务,重新载入Nginx等,下面我就进行一些简单的介绍.1.启动 ...