【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 微信支付教程系列之公众号支付
微信支付教程系列之公众号支付 今天,我们接着讲微信支付的系列教程,前面,我们讲了这个微信红包和扫码支付.现在,我们讲讲这个公众号支付.公众号支付的应用环境常见的用户通过公众号,然后再通 ...
随机推荐
- 创建一个RAS 非对称 公私密钥示例
static void Main(string[] args) { RSAParameters pub; RSAParameters priv; using (var rsa = new RSACry ...
- typescript nodejs 依赖注入实现
依赖注入通常也是我们所说的ioc模式,今天分享的是用typescript语言实现的ioc模式,这边用到的主要组件是 reflect-metadata 这个组件可以获取或者设置元数据信息,它的作用是拿到 ...
- VSCode 命令
淘宝 NPM 镜像 https://npm.taobao.org/ Ctrl+~ 显示终端 npm start 启动项目 cnpm install 安装模块
- TinyXPath 对于xpath标准的支持测试
xpath是一种基于xml的查询标准,一般的xml解析工具都具有,有的因为卓越的xpath性能而出名,其匹配查询算法牛逼而又高效,和正则有的一拼.虽然我现在大部分从事前端工作了,但是对于原理性的东西还 ...
- js new Date()不带时分秒时,时间变了 问题解决
//先把电脑系统时间的 时区 调到别的时间一下如 夏威夷 UTC-10:00//在浏览器的Console里运行如下代码,getMonth是从0开始的,所以要+1 var d=new Date(&quo ...
- 2015年br运维操作归档
归档2015年在br做运维时常用的命令,主要梳理出log的过滤操作. 对于日志文本的处理,常见还是sed和awk,具体如下: 统计ip访问量: cat nginx.log |awk '{print $ ...
- SpringBoot解决跨域请求拦截
前言 同源策略:判断是否是同源的,主要看这三点,协议,ip,端口. 同源策略就是浏览器出于网站安全性的考虑,限制不同源之间的资源相互访问的一种政策. 比如在域名https://www.baidu.co ...
- DTC测试
DTC配置好后要在2台server之间测试下是否能使用. 1.在A台上建立ODBC的连接B. 控制面板→管理工具→ODBC Datat Source(32bit) 点击添加 选择SQL SERVER ...
- prometheus学习系列四: Prometheus详述
数据模型 Prometheus 是将所有数据存为时序数据. 每个时序数据是由指标名称和可选的键值对(称之为标签)唯一标识. 度量类型 counter: 单调递增的计数器,如果标识已经服务的请求数量可以 ...
- jperf windows
jperf windows版是款简单实用的网络性能测试的工具:它也是款图形界面的iperf程序,可以这进行使用JPerf程序的时候,快速的进行简化您的命令行参数,而且这进行测试结束之后,还是以图形化的 ...