题目

给定一颗\(n\)个点的树,边权为1,并给出\(\{w_i\}\)满足\(w_0=0\)

\[f(i) = \sum_{j=1}^{n} w_{dis(i,j)}
\]

依次输出每一个\(f_i\)

\(n \le 10^5\)

题解

  • 点分治之后考虑深度
  • 对一个深度\(i\),接着就是要求\(g_ i = \sum_{j} \ cnt_j \times w_{i+j}\)
  • 直接卷积即可
  • 时间复杂度:\(O ( n \ log^2n)\)

Code

#include<bits/stdc++.h>
#define mod 1000000007
#define ll long long
#define ld double
using namespace std;
const int N=1<<20;
const ld pi=acos(-1);
int n,val[N],o=1,hd[N],vis[N],sz[N],rt,Mx,dep[N],size,mxl,L,len,rev[N],st[N],tot,ans[N],mxd;
struct Edge{int v,nt;}E[N<<1];
char gc(){
static char*p1,*p2,s[1000000];
if(p1==p2)p2=(p1=s)+fread(s,1,1000000,stdin);
return(p1==p2)?EOF:*p1++;
}
int rd(){
int x=0;char c=gc();
while(c<'0'||c>'9')c=gc();
while(c>='0'&&c<='9')x=(x<<1)+(x<<3)+c-'0',c=gc();
return x;
}
void adde(int u,int v){
E[o]=(Edge){v,hd[u]};hd[u]=o++;
E[o]=(Edge){u,hd[v]};hd[v]=o++;
}
struct C{
ld x,y;
C(ld _x=0,ld _y=0):x(_x),y(_y){};
C operator +(const C&A)const{return C(x+A.x,y+A.y);}
C operator -(const C&A)const{return C(x-A.x,y-A.y);}
C operator /(const ld&A)const{return C(x/A,y/A);}
C operator *(const C&A)const{return C(x*A.x-y*A.y,x*A.y+y*A.x);}
}a[N],b[N],Wn[2][N];
void fft(C*A,int f){
for(int i=0;i<len;++i)if(i<rev[i])swap(A[i],A[rev[i]]);
for(int i=1;i<len;i<<=1){
C wn=Wn[!~f][i];
for(int j=0;j<len;j+=i<<1){
C w(1,0);
for(int k=0;k<i;++k,w=w*wn){
C x=A[j+k],y=w*A[j+k+i];
A[j+k]=x+y,A[j+k+i]=x-y;
}
}
}
if(!~f)for(int i=0;i<len;++i)A[i]=A[i]/len;
}
void dfs(int u,int fa){
st[++tot]=u;mxl=max(mxl,dep[u]);
for(int i=hd[u];i;i=E[i].nt){
int v=E[i].v;
if(v==fa||vis[v])continue;
dep[v]=dep[u]+1;
dfs(v,u);
}
}
void calc(int u,int fg){
tot=mxl=L=0;dfs(u,0);
mxd=min(mxl*2,n);
for(len=1;len<=mxl+mxd;len<<=1,L++);
for(int i=0;i<len;++i){
a[i]=b[i]=C(0,0);
rev[i]=(rev[i>>1]>>1)|((i&1)<<(L-1));
}
for(int i=1;i<=tot;++i)a[mxl-dep[st[i]]].x++;
for(int i=0;i<=mxd;++i)b[i]=C(val[i],0);
fft(a,1);fft(b,1);
for(int i=0;i<len;++i)a[i]=a[i]*b[i];
fft(a,-1);
for(int i=1;i<=tot;++i){
int x=st[i];
ans[x]+=fg*int(a[mxl+dep[x]].x+0.1);
}
}//
void getrt(int u,int fa){
sz[u]=1;int mx=0;
for(int i=hd[u];i;i=E[i].nt){
int v=E[i].v;
if(v==fa||vis[v])continue;
getrt(v,u);
sz[u]+=sz[v];
if(sz[v]>mx)mx=sz[v];
}
if(mx<size-sz[u])mx=size-sz[u];
if(Mx>mx)rt=u,Mx=mx;
}
void solve(int u){
// cerr<<u<<endl;
vis[u]=1;dep[u]=0;
calc(u,1);
int tmp=size;
for(int i=hd[u];i;i=E[i].nt){
int v=E[i].v;
if(vis[v])continue;
dep[v]=1;calc(v,-1);
size=sz[v]<sz[u]?sz[v]:tmp-sz[u];
Mx=n;rt=0;getrt(v,0);
solve(rt);
}
}
int main(){
freopen("a.in","r",stdin);
freopen("a.out","w",stdout);
n=rd();
for(int i=0;i<n;++i)val[i]=rd();
for(int i=1;i<n;++i)adde(rd(),rd());
for(int i=0;i<19;++i){
int x=1<<i;
Wn[0][x]=C(cos(pi/x),sin(pi/x));
Wn[1][x]=C(cos(pi/x),-sin(pi/x));
}//
rt=0;Mx=size=n;
getrt(1,0);
solve(rt);
for(int i=1;i<=n;++i)printf("%d ",ans[i]);
return 0;
}//

【JZOJ6245】【20190627】A的更多相关文章

  1. 【疯狂造轮子-iOS】JSON转Model系列之二

    [疯狂造轮子-iOS]JSON转Model系列之二 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 上一篇<[疯狂造轮子-iOS]JSON转Model系列之一> ...

  2. 【疯狂造轮子-iOS】JSON转Model系列之一

    [疯狂造轮子-iOS]JSON转Model系列之一 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 之前一直看别人的源码,虽然对自己提升比较大,但毕竟不是自己写的,很容易遗 ...

  3. 【原创分享·支付宝支付】HBuilder打包APP调用支付宝客户端支付

    前言 最近有点空余时间,所以,就研究了一下APP支付.前面很早就搞完APP的微信支付了,但是由于时间上和应用上的情况,支付宝一直没空去研究.然后等我空了的时候,发现支付宝居然升级了支付逻辑,虽然目前还 ...

  4. 【AutoMapper官方文档】DTO与Domin Model相互转换(上)

    写在前面 AutoMapper目录: [AutoMapper官方文档]DTO与Domin Model相互转换(上) [AutoMapper官方文档]DTO与Domin Model相互转换(中) [Au ...

  5. 【Win 10 应用开发】应用预启动

    所谓预启动,其实你一看那名字就知道是啥意思了,这是直接译,也找不到比这个叫法更简练的词了.在系统资源允许的情况下(比如电池电量充足,有足够的内存空间),系统会把用户常用的应用程序在后台启动,但不会显示 ...

  6. 【Win 10 应用开发】启动远程设备上的应用

    这个功能必须在“红石-1”(build 14393)以上的系统版中才能使用,运行在一台设备上的应用,可以通过URI来启动另一台设备上的应用.激活远程应用需要以下前提: 系统必须是build 14393 ...

  7. 【开源】分享2011-2015年全国城市历史天气数据库【Sqlite+C#访问程序】

    由于个人研究需要,需要采集天气历史数据,前一篇文章:C#+HtmlAgilityPack+XPath带你采集数据(以采集天气数据为例子),介绍了基本的采集思路和核心代码,经过1个星期的采集,历史数据库 ...

  8. 【原创分享·微信支付】C# MVC 微信支付教程系列之现金红包

            微信支付教程系列之现金红包           最近最弄这个微信支付的功能,然后扫码.公众号支付,这些都做了,闲着无聊,就看了看微信支付的其他功能,发现还有一个叫“现金红包”的玩意,想 ...

  9. 【原创分享·微信支付】 C# MVC 微信支付教程系列之扫码支付

    微信支付教程系列之扫码支付                  今天,我们来一起探讨一下这个微信扫码支付.何为扫码支付呢?这里面,扫的码就是二维码了,就是我们经常扫一扫的那种二维码图片,例如,我们自己添 ...

  10. 【原创分享·微信支付】 C# MVC 微信支付教程系列之公众号支付

    微信支付教程系列之公众号支付         今天,我们接着讲微信支付的系列教程,前面,我们讲了这个微信红包和扫码支付.现在,我们讲讲这个公众号支付.公众号支付的应用环境常见的用户通过公众号,然后再通 ...

随机推荐

  1. Django--模型层进阶

    目录 QuerySet对象 可切片 可迭代 惰性查询 缓存机制 何时查询集不会被缓存? exists()与iterator()方法 exists() iterator() 中介模型 查询优化 表数据 ...

  2. 用jQuery的offset()替代javascript的offset

    在项目中遇到了一个问题,获取某个块状元素的offsetTop和offsetLeft时候会出现问题,并不是相对浏览器的位置,而是相对于某一个块状元素的位置,具体参照元素也没找到,因为页面中没有设置pos ...

  3. 石油petrolaeum单词petrolaeum原油

    petroleum 1.a flammable liquid ranging in color from clear to very dark brown and black, consisting ...

  4. C#8.0—非空引用类型

    非空引用类型--C#8.0 原文地址:https://devblogs.microsoft.com/dotnet/try-out-nullable-reference-types/?utm_sourc ...

  5. Filter和Listener

    Filter: 1.概念: web中的过滤器:当访问服务器的资源时,过滤器可以将请求拦截下来,做一些事. 过滤器的作用:一般用于完成一些通用的操作:登录验证.统一编码处理,敏感字符处理.... 2.快 ...

  6. 【转载】自定义View学习笔记之详解onMeasure

    网上对自定义View总结的文章都很多,但是自己还是写一篇,好记性不如多敲字! 其实自定义View就是三大流程,onMeasure.onLayout.onDraw.看名字就知道,onMeasure是用来 ...

  7. Odoo采购模块

    转载请注明原文地址:https://www.cnblogs.com/ygj0930/p/10825976.html 一:采购过程 采购业务可以分为以下几个流程: 1)建立供应商信息 企业需要与供应商建 ...

  8. (二)MongoDB基本概念

    (二)MongoDB基本概念 mongodb 2018年03月07日 08时43分53秒 mognoDB是一个面向文档的数据库,而不是关系型数据库,是不是用关系型数据库主要是为了获得更好的扩展性,还会 ...

  9. Django如何与JQuery进行数据通信?

    index.html: 下面form的action属性表示当提交表单时,向何处发送表单数据 <script src="https://code.jquery.com/jquery-3. ...

  10. Nginx与多版本Php配置

    这次忍住没爆粗口,但真的,通过rpm包,yum安全的php-fpm,让我无言以对. 一个Php程序代码,到处测试,显示的菜单都OK,但独独在正式服务器的php-fpm下,少了很多菜单, 不知道是肿么回 ...