博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
BZOJ 3727 DP?推式子..
阅读量:5016 次
发布时间:2019-06-12

本文共 895 字,大约阅读时间需要 2 分钟。

 思路:

 

 

设$sum[i]表示i的子树中a[i]的和$

$b[1]=\Sigma a[i]*dis[i] = \Sigma _{i=2} ^n sum[i]$

$b[x]-b[fa[x]]=sum[1]-2*sum[x]$

$sum[1]={\Sigma_{i=2}^n (b[x]-b[fa[x]])+2*b[1] \over n-1}$

$求出sum[1]以后根据a[x]=sum[x]-\Sigma_{v是x的儿子} sum[v]带入求出其它值即可$

$复杂度O(n)$

//By SiriusRen#include 
#include
using namespace std;#define int long longconst int N=600500;int n,xx,yy,first[N],next[N],v[N],tot,fa[N],rev[N],cnt,b[N],X;long long sum[N],ans[N];void add(int x,int y){v[tot]=y,next[tot]=first[x],first[x]=tot++;}void dfs(int x){ rev[++cnt]=x; for(int i=first[x];~i;i=next[i])if(v[i]!=fa[x]) fa[v[i]]=x,dfs(v[i]);}void dfs2(int x){ ans[x]=sum[x]; for(int i=first[x];~i;i=next[i])if(v[i]!=fa[x]) dfs2(v[i]),ans[x]-=sum[v[i]];}signed main(){ memset(first,-1,sizeof(first)); scanf("%lld",&n); for(int i=1;i

 

转载于:https://www.cnblogs.com/SiriusRen/p/6667250.html

你可能感兴趣的文章
merge-two-sorted-lists
查看>>
poj1061——扩展gcd水题
查看>>
UVa400.Unix ls
查看>>
Educational Codeforces Round 60 (Rated for Div. 2) C. Magic Ship
查看>>
Windows 2008 R2系统开机时如何不让Windows进行磁盘检测?
查看>>
WP7应用开发笔记(18) 本地化与多语言
查看>>
解决 .so文件64与32不兼容问题
查看>>
归并排序法
查看>>
spark开发生成EXE
查看>>
Vue 全家桶介绍
查看>>
Linux lsof命令 umount U盘
查看>>
CRC标准以及简记式
查看>>
SEO搜索引擎
查看>>
关于本地使用tomcat部署web应用,浏览器自动跳转为https的问题
查看>>
一、Text To Speech
查看>>
Java读取并下载网络文件
查看>>
github上构建自己的个人网站
查看>>
在word中粘贴的图片为什么显示不完整
查看>>
SQL Server 数据库的鼠标操作
查看>>
net软件工程师求职简历
查看>>