题目

给定一颗\(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. c#调用python脚本实现排序(适用于python脚本中不包含第三方模块的情况)

    引用:https://www.cnblogs.com/zoe-yan/p/10374757.html 利用vs2017c#调用python脚本需要安装IronPython.我是通过vs2017的工具- ...

  2. 计数计量单位KMGTPEZY【计算机】【天文】

    · Bit = Binary Digit · Bits = · s = Kilo · Kilo s = Mega · Mega s = Giga · Giga s = Tera · Tera s = ...

  3. 自定义WPF Popup控件

    解决问题 1.WPF Popup 不随着 Window 一起移动的问题 2.WPF Popup 总是显示在最前面 引用命名空间 xmlns:ctrl="clr-namespace:Micro ...

  4. Linux下mongoDB下载与安装

    原文连接:(http://www.studyshare.cn/blog/details/1168/0)一.下载 官网下载:点击下载 选择合适的版本 百度网盘下载:点击下载  提取码:rm12 此处提供 ...

  5. JavaScript---Dom树详解,节点查找方式(直接(id,class,tag),间接(父子,兄弟)),节点操作(增删改查,赋值节点,替换节点,),节点属性操作(增删改查),节点文本的操作(增删改查),事件

    JavaScript---Dom树详解,节点查找方式(直接(id,class,tag),间接(父子,兄弟)),节点操作(增删改查,赋值节点,替换节点,),节点属性操作(增删改查),节点文本的操作(增删 ...

  6. Spring Boot 框架下使用MyBatis访问数据库之基于XML配置的方式

    MyBatis 是一款优秀的持久层框架,它支持定制化 SQL.存储过程以及高级映射.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集.MyBatis 可以使用简单的 XML ...

  7. [JS设计模式]:观察者模式(即发布-订阅者模式)(4)

    简介 观察者模式又叫发布---订阅模式,它定义了对象间的一种一对多的关系,让多个观察者对象同时监听某一个主题对象,当一个对象发生改变时,所有依赖于它的对象都将得到通知. 举一个现实生活中的例子,例如小 ...

  8. 面试题:什么叫B树

    B是balanced的意思 是在二叉查找树  树的基础上增加了平衡的性质   导致它不是  二叉树了,变成了多叉树,但是叉几路又有了限制  否则怎么平衡呢 一棵m阶B树(balanced tree o ...

  9. Swaks绕过SPF验证进行邮件伪造

    0x00 swaks简介 Swaks是一个功能强大,灵活,可编写脚本,面向事务的SMTP测试工具,由John Jetmore编写和维护. 目前Swaks托管在私有svn存储库中.官方项目页面是http ...

  10. Ajax跨域问题及解决方案 asp.net core 系列之允许跨越访问(Enable Cross-Origin Requests:CORS) c#中的Cache缓存技术 C#中的Cookie C#串口扫描枪的简单实现 c#Socket服务器与客户端的开发(2)

    Ajax跨域问题及解决方案   目录 复现Ajax跨域问题 Ajax跨域介绍 Ajax跨域解决方案 一. 在服务端添加响应头Access-Control-Allow-Origin 二. 使用JSONP ...