LINK:旗鼓相当的对手

考场上遇到这种简单的树形dp优化题目我真的不一定能写出来..

虽然这道题思路很简单 设f[i][j]表示距i距离为j的点的个数 g[i][j]表示距i距离为j的点权和。

可以发现我们转枚举子树转移的时候可以得到某个点的答案。其实这道题让我们求的是以x为根的所有子树之间的答案。

这两个数组转移以深度转移 所以复杂度为n^2 长链刨分一下即可O(n)。

但是我并不会长链刨分时的指针写法。所以考虑其他做法。

可以发现如果维护这两个数组的转移必然n^2 这个时候我们考虑直接给全局贡献 即每个点x以d[x]为深度的贡献。

这样我们就不需要维护距某个点的深度了 直接查d[x]+k的距离即可。

但是这需要子树内外的差分。暴力差分还是n^2.

考虑dsu on tree 暴力把轻儿子删掉之后统计重儿子 然后重儿子的代价保留。

对于某个点我们再次遍历所有轻儿子一边统计答案一边累计数组。

最后如果这个点也是轻儿子那么再次情况即可。

一个点距根节点只有logn条轻边 所以这样做复杂度nlogn.

const int MAXN=100010;
int n,len,k;ll ans[MAXN],w[MAXN],sum;
int son[MAXN],a[MAXN],d[MAXN],f[MAXN],cnt[MAXN],sz[MAXN];
int lin[MAXN],ver[MAXN<<1],nex[MAXN<<1];
inline void add(int x,int y)
{
ver[++len]=y;nex[len]=lin[x];lin[x]=len;
ver[++len]=x;nex[len]=lin[y];lin[y]=len;
}
inline void dfs(int x,int father)
{
sz[x]=1;f[x]=father;
d[x]=d[father]+1;
go(x)
{
if(tn==father)continue;
dfs(tn,x);
sz[x]+=sz[tn];
if(sz[son[x]]<sz[tn])son[x]=tn;
}
}
inline void update(int x,int fa,int op)
{
int ww=k+2*d[fa]-d[x];
if(ww>0&&op>0&&x!=fa)
{
sum=sum+(ll)cnt[ww]*a[x];
sum=sum+w[ww];
}
go(x)if(tn!=f[x])update(tn,fa,op);
}
inline void add(int x,int fa,int op)
{
cnt[d[x]]+=op;w[d[x]]+=op*a[x];
go(x)if(tn!=f[x])add(tn,fa,op);
}
inline void dp(int x,int op)
{
go(x)if(tn!=f[x]&&tn!=son[x])dp(tn,0);//先处理轻儿子.
if(son[x])dp(son[x],1);//处理重儿子.
go(x)if(tn!=f[x]&&tn!=son[x])update(tn,x,1),add(tn,x,1);
++cnt[d[x]];w[d[x]]+=a[x];ans[x]=sum;sum=0;
if(!op)add(x,x,-1);
}
int main()
{
freopen("1.in","r",stdin);
get(n);get(k);
rep(1,n,i)get(a[i]);
rep(1,n-1,i)add(read(),read());
dfs(1,0);dp(1,1);
rep(1,n,i)printf("%lld ",ans[i]);
return 0;
}

牛客练习赛60 E 旗鼓相当的对手的更多相关文章

  1. 牛客练习赛60 A—F题解(缺E题)

    本蒟蒻这次只过了三题 赛后学习了一下出题人巨佬的标码(码风比我好多了 贴的代码有些是仿出题人)现在将自己的理解写下来与大家分享 A这个题一分析就是每个数字都会与所有数字&一下 (a&a ...

  2. 牛客练习赛60 D 斩杀线计算大师

    LINK:斩杀线计算大师 给出a,b,c三个值 求出 ax+by+cz=k的x,y,z的正整数解 保证一定有解. 考虑两个数的时候 ax+by=k 扩展欧几里得可以解决. 三个数的时候 一个暴力的想法 ...

  3. 牛客练习赛31 B 赞迪卡之声妮莎与奥札奇 逻辑,博弈 B

    牛客练习赛31 B 赞迪卡之声妮莎与奥札奇 https://ac.nowcoder.com/acm/contest/218/B 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 2621 ...

  4. [堆+贪心]牛客练习赛40-B

    传送门:牛客练习赛40 题面: 小A手头有 n 份任务,他可以以任意顺序完成这些任务,只有完成当前的任务后,他才能做下一个任务 第 i 个任务需要花费  x_i 的时间,同时完成第 i 个任务的时间不 ...

  5. 【并查集缩点+tarjan无向图求桥】Where are you @牛客练习赛32 D

    目录 [并查集缩点+tarjan无向图求桥]Where are you @牛客练习赛32 D PROBLEM SOLUTION CODE [并查集缩点+tarjan无向图求桥]Where are yo ...

  6. 牛客练习赛31 D 神器大师泰兹瑞与威穆 STL,模拟 A

    牛客练习赛31 D 神器大师泰兹瑞与威穆 https://ac.nowcoder.com/acm/contest/218/D 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 26214 ...

  7. 最小生成树--牛客练习赛43-C

    牛客练习赛43-C 链接: https://ac.nowcoder.com/acm/contest/548/C 来源:牛客网 题目描述 ​ 立华奏是一个刚刚开始学习 OI 的萌新. 最近,实力强大的 ...

  8. 牛客练习赛28-B(线段树,区间更新)

    牛客练习赛28 - B 传送门 题目 qn姐姐最好了~ ​ qn姐姐给你了一个长度为n的序列还有m次操作让你玩, ​ 1 l r 询问区间[l,r]内的元素和 ​ 2 l r 询问区间[l,r]内的 ...

  9. 牛客练习赛26:D-xor序列(线性基)

    链接:牛客练习赛26:D-xor序列(线性基) 题意:小a有n个数,他提出了一个很有意思的问题:他想知道对于任意的x, y,能否将x与这n个数中的任意多个数异或任意多次后变为y 题解:线性基 #inc ...

随机推荐

  1. HDU 2157 How many ways?? 题解

    题目 春天到了, HDU校园里开满了花, 姹紫嫣红, 非常美丽. 葱头是个爱花的人, 看着校花校草竞相开放, 漫步校园, 心情也变得舒畅. 为了多看看这迷人的校园, 葱头决定, 每次上课都走不同的路线 ...

  2. 002.Nginx安装及启动

    一 Nginx yum安装 1.1 前置准备 1 [root@nginx01 ~]# systemctl status firewalld.service #检查防火墙 2 [root@nginx01 ...

  3. React当中的路由使用

    React 当中的路由 使用React构建的单页面应用,要想实现页面间的跳转,首先想到的就是使用路由.在React中,常用的有两个包可以实现这个需求,那就是react-router和react-rou ...

  4. Report.Net 本地数据库、WebService、Socket报表

    本地.服务器的Access.Sql报表编辑.预览.打印. 可自定义预览界面,可方便嵌入到你的程序中去,提供接口函数,如有需要可自行添加接口. 预览采用单双面方式,因为如果页面过多,预览不能全部加载,所 ...

  5. 不会用Java Future,我怀疑你泡茶没我快, 又是超长图文!!

    你有一个思想,我有一个思想,我们交换后,一个人就有两个思想 If you can NOT explain it simply, you do NOT understand it well enough ...

  6. mongodb(四):对文档操作增删查改(python)

    连接mongodb #!/usr/bin/env python # -*- coding:utf-8 -*- import pymongo mongo_client = pymongo.MongoCl ...

  7. 数据可视化之powerBI技巧(八)Power BI按多列排序的技巧

    目前PowerBI的表格已经支持多列排序,但是矩阵依然还不支持按多个字段排序,虽然这个需求很普遍,这里利用DAX提供一个变通的实现方式. 模拟数据如下,有两个数据指标: 对类别首先按[指标一]进行排序 ...

  8. 02-Python运算符

    一.简介 以10 - 5为例,‘10 - 5’叫做表达式,表达式可以分解成运算符和操作数.整数10和5被称为操作数.‘-’称为运算符. 二.算术运算符 运算符 描述 示例 结果 + 加 - 两个对象相 ...

  9. 原来不只是fastjson,这个你每天都在用的类库也被爆过反序列化漏洞!

    GitHub 15.8k Star 的Java工程师成神之路,不来了解一下吗! GitHub 15.8k Star 的Java工程师成神之路,真的不来了解一下吗! GitHub 15.8k Star ...

  10. mybatis的<if>标签,<foreach>标签,<collection>标签,<association>标签以及useGeneratedKeys用法

    <if>标签 1.判断非空或不等于 <if test="assessTypes!= null and assessTypes!='' "> AND FIND ...