题目

给定一颗\(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. axios捕获401 赋值token

    //捕获401 // http request 拦截器 axios.interceptors.request.use( config => { const token = localStorag ...

  2. MAC电脑下Appium + python3 + robotframework ios的真机测试环境搭建

    本人的环境搭建前的准备,MAC电脑一台(macOS Mojave 10.14.0及以上),Xcode 10.0及以上   ,自己注册的一个Apple ID 账户,必须你的电脑能连接互联网,最好不要用公 ...

  3. Nginx 开启status用以监控状态信息

    Nginx 可以通过with-http_stub_status_module模块来监控nginx的一些状态信息.1.通过nginx -V来查看是否有with-http_stub_status_modu ...

  4. Beego 学习笔记12:文件的操作

    文件的操作 1>     此事例操作的是text文件 2>     文件的操作有读取text内容,将内容写入到文件中,删除文件,创建文件 3>     新建一个控制器,名为rwfil ...

  5. HTTP协议中GET和POST

    1. get 它用于获取信息,注意,他只是获取.查询数据,也就是说它不会修改服务器上的数据,从这点来讲,它是数据安全的,而稍后会提到的Post它是可以修改数据的,所以这也是两者差别之一了 2. pos ...

  6. 3 Dalvik基础知识

    Dalvik汇编基础知识: Dalvik指令:由位描述+指令格式标示 位描述: 1. 每16位空格隔开 2. 每个字母表示4位,每个字母按从高字节开始,排列到低字节.每四位之间可用 | 分开表示不同内 ...

  7. ML-对偶(Duality)问题 KKT 条件

    Primal => Dual 现实中我们遇到的原优化问题, 写为标准型的话是这样的. \(min _w f(w) \\ s.t. \\ g_i(w) <=0 \\ h_i(w) = 0\) ...

  8. scala快速入门之文档注释

    scala快速入门之文档注释 1.在项目栏的目录树中找到该源码,右击点击Show in Explorer, 即可找到该源码的本地路径,在路径中输入cmd 2.执行scaladoc -d  生成文档注释 ...

  9. Werkzeug——python web开发工具包

    转载请注明原文地址:https://www.cnblogs.com/ygj0930/p/10826062.html 一:Werkzeug是个啥 1)Werkzeug是一个工具包,它封装了很多东西,诸如 ...

  10. SpringCloud2.0 Hystrix Feign 基于Feign实现断路器 基础教程(七)

    1.启动[服务中心]集群,工程名:springcloud-eureka-server 参考 SpringCloud2.0 Eureka Server 服务中心 基础教程(二) 2.启动[服务提供者]集 ...