【JZOJ6245】【20190627】A
题目
给定一颗\(n\)个点的树,边权为1,并给出\(\{w_i\}\)满足\(w_0=0\)
\]
依次输出每一个\(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的更多相关文章
- 【疯狂造轮子-iOS】JSON转Model系列之二
[疯狂造轮子-iOS]JSON转Model系列之二 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 上一篇<[疯狂造轮子-iOS]JSON转Model系列之一> ...
- 【疯狂造轮子-iOS】JSON转Model系列之一
[疯狂造轮子-iOS]JSON转Model系列之一 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 之前一直看别人的源码,虽然对自己提升比较大,但毕竟不是自己写的,很容易遗 ...
- 【原创分享·支付宝支付】HBuilder打包APP调用支付宝客户端支付
前言 最近有点空余时间,所以,就研究了一下APP支付.前面很早就搞完APP的微信支付了,但是由于时间上和应用上的情况,支付宝一直没空去研究.然后等我空了的时候,发现支付宝居然升级了支付逻辑,虽然目前还 ...
- 【AutoMapper官方文档】DTO与Domin Model相互转换(上)
写在前面 AutoMapper目录: [AutoMapper官方文档]DTO与Domin Model相互转换(上) [AutoMapper官方文档]DTO与Domin Model相互转换(中) [Au ...
- 【Win 10 应用开发】应用预启动
所谓预启动,其实你一看那名字就知道是啥意思了,这是直接译,也找不到比这个叫法更简练的词了.在系统资源允许的情况下(比如电池电量充足,有足够的内存空间),系统会把用户常用的应用程序在后台启动,但不会显示 ...
- 【Win 10 应用开发】启动远程设备上的应用
这个功能必须在“红石-1”(build 14393)以上的系统版中才能使用,运行在一台设备上的应用,可以通过URI来启动另一台设备上的应用.激活远程应用需要以下前提: 系统必须是build 14393 ...
- 【开源】分享2011-2015年全国城市历史天气数据库【Sqlite+C#访问程序】
由于个人研究需要,需要采集天气历史数据,前一篇文章:C#+HtmlAgilityPack+XPath带你采集数据(以采集天气数据为例子),介绍了基本的采集思路和核心代码,经过1个星期的采集,历史数据库 ...
- 【原创分享·微信支付】C# MVC 微信支付教程系列之现金红包
微信支付教程系列之现金红包 最近最弄这个微信支付的功能,然后扫码.公众号支付,这些都做了,闲着无聊,就看了看微信支付的其他功能,发现还有一个叫“现金红包”的玩意,想 ...
- 【原创分享·微信支付】 C# MVC 微信支付教程系列之扫码支付
微信支付教程系列之扫码支付 今天,我们来一起探讨一下这个微信扫码支付.何为扫码支付呢?这里面,扫的码就是二维码了,就是我们经常扫一扫的那种二维码图片,例如,我们自己添 ...
- 【原创分享·微信支付】 C# MVC 微信支付教程系列之公众号支付
微信支付教程系列之公众号支付 今天,我们接着讲微信支付的系列教程,前面,我们讲了这个微信红包和扫码支付.现在,我们讲讲这个公众号支付.公众号支付的应用环境常见的用户通过公众号,然后再通 ...
随机推荐
- SQL Server中用户账号在数据库中的安全性,可以控制用户的权限
今天在公司SQL Server数据库中,查到一个SQL Server用户账号"DemoUser": "DemoUser"不在数据库服务器的sysadmin角色中 ...
- Redis常用配置和命令总结
Redis(全称:Remote Dictionary Server 远程字典服务)是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并提供多种语言 ...
- keras学习入门一
基本概念 1. 张量 tensor 所有的数据类型都可以看成是张量,可以看成是向量,矩阵在推广 张量的阶,有时候也叫维度,或是轴(axis) 0阶张量如 [] ,5 也叫做标量 1阶张量 如 [ 1, ...
- 03、新手必须掌握的Linux命令
Ⅰ. 常用系统工作命令 1. echo 命令 echo命令用于在终端输出字符串货变量提取后的值,格式为"echo [字符串 | $变量]" 例:把指定字符串"LinxuH ...
- k8s的node节点无法调度的问题
1.现象,创建deployment时 2.查看污点 [fedora@k8s-cluster--ycmwlao4q5wz-master- ~]$ kubectl describe node k8s-cl ...
- sqlserver建表及注释
--**********************************************创建表************************************************* ...
- python的异常种类
AttributeError 访问一个对象没有的属性 比如:foo.x 但是foo没有x属性 IOError 输入/输出异常 基本是无法打开文件 ImportError 无法映入模块或包 路径或者名称 ...
- Java的常见术语(PO/POJO/VO/BO/DAO/DTO)
PO(persistant object) 持久对象在o/r 映射的时候出现的概念,如果没有o/r映射,就没有这个概念存在了.通常对应数据模型(数据库),本身还有部分业务逻辑的处理.可以看成是与数据库 ...
- Mac原型动画设计软件Drama创建3D图层的注意事项,你知道吗?
Drama创建3D图层的注意事项:要跨层保留3D空间,可以使用组.它们具有保留子图层和嵌套组的3D空间的特殊功能. Drama支持通过在三维空间中定位和旋转2D图层来创建3D内容.要在3D空间中定位图 ...
- 常用Windows命令、常用 Cmd命令(补充)
常用的Windows 命令使用能够提升工作效率以及快捷处理事项. 下面为平时常用的Windows 命令/cmd 命令. 一.以下命令无需打开cmd 窗口即可操作(输入完毕 打个 回车,即可执行). 1 ...