代码风格与树形DP
Streaming很惨,不过因为比赛之间没有提交过就没掉(或掉了)rating.第二题是一个树形DP,但是我都在想第一题了,简直作死.
看着神犇的代码我也是醉了...各种宏,真是好好写会死系列. 看到他们Tree DP都用的DFS,突然感觉我这个蒟蒻的生活中充满了无力...
我一般都喜欢用BFS进行Tree DP.这样坏处很多,难调试,容易爆空间等.好处也有,写起来快,代码短,跑得飞快,判重简单.不过这样做是有条件的,而今天的Streaming这题就是一道可以的题.
然后讲讲今天这道LCAStat吧.
作为一个不会写Tarjan LCA的蒟蒻,这道题出的比较有素质.至少你不需会LCA(树上倍增差不多会吧).有些神犇这么暴力,对此我只能表示Orz.
让我们思考一下.对于每一个点,他的(姑且称为LCA Score)应该怎么算?
转换个思路,如何让两个点的LCA为一个给定的点i?
显然,这两个点必须是i或在i的不同子树中.那么我们就渐渐有了思路.
注意算sum(x){sum(y){x*y}}有个很简单的办法即sum(x){x}*sum(y){y}
那么求出每一棵子树的totalWeight,当在一个结点新访问到一个子结点时,这个点的对分值贡献就是totw[i]*(noww[d]+w[d])*2
totw[i]就是这个访问到的子结点的totalWeight,noww[d]就是已经加入这个父结点(不包括新访问的这个)的子树的总重,w[d]就是这个父结点的weight
为什么要乘以2?因为这道题目考虑顺序,即a=3,b=5和a=5,b=3要算两次.
每次有一个结点的所有子结点都被访问了就松弛这个结点.
自己看代码吧,去了所有mod.
#include <cstdio>
#include <cstring>
long long fat[200000],w[200000],f[200000],sub[200000],totw[200000],n,p,i,sum;
long long q[200000],qh,qt;
int main(int argc,char const *argv[]){
scanf("%lld %lld",&n,w+1);
for(i=2;i<=n;++i){
scanf("%lld %lld",fat+i,w+i);
++sub[fat[i]];
}
for(i=1;i<=n;++i){
f[i]=0;
if(!sub[i]){
q[qt++]=i;
totw[i]=0;
f[i]=0;
}
}
while(qh!=qt){
i=q[qh++];
f[i]+=(w[i]*w[i])*(w[i]+totw[i]*2);
totw[i]+=w[i];
sum=sum+f[i];
f[fat[i]]+=(totw[i]*totw[fat[i]])*w[fat[i]]*2;
totw[fat[i]]+=totw[i];
--sub[fat[i]];
if(!sub[fat[i]]) q[qt++]=fat[i];
}
printf("%lld\n", sum);
return 0;
}
//非AC代码,只是为了清楚的一份演示代码
代码风格与树形DP的更多相关文章
- 树形DP+(分组背包||二叉树,一般树,森林之间的转换)codevs 1378 选课
codevs 1378 选课 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description 学校实行学分制.每门的必修课都有固定的学分 ...
- [程序员代码面试指南]二叉树问题-找到二叉树中的最大搜索二叉树(树形dp)
题意 给定一颗二叉树的头节点,已知所有节点的值都不一样,找到含有节点最多的搜索二叉子树,并返回这个树的头节点. 题解 在后序遍历过程中实现. 求解步骤按树形dp中所列步骤.可能性三种:左子树最大.右子 ...
- BZOJ-3227 红黑树(tree) 树形DP
个人认为比较好的(高端)树形DP,也有可能是人傻 3227: [Sdoi2008]红黑树(tree) Time Limit: 10 Sec Memory Limit: 128 MB Submit: 1 ...
- 树形DP总结,持续更新
自己做了动态规划的题目已经有了一个月,但是成效甚微,所以来总结一下动态规划,希望自己能够温故知新.这个博客是关于树形dp的,动态规划的一类题目. 首先从最简单的树形DP入手,树形DP顾名思义就是一棵树 ...
- 树形DP
切题ing!!!!! HDU 2196 Anniversary party 经典树形DP,以前写的太搓了,终于学会简单写法了.... #include <iostream> #inclu ...
- hdu1561 The more, The Better (树形dp+背包)
题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=1561 思路:树形dp+01背包 //看注释可以懂 用vector建树更简单. 代码: #i ...
- HDU5834 Magic boy Bi Luo with his excited tree(树形DP)
题目 Source http://acm.hdu.edu.cn/showproblem.php?pid=5834 Description Bi Luo is a magic boy, he also ...
- HDU 1561 树形DP入门
The more, The Better Time Limit: 6000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Oth ...
- Codeforces Round #382 (Div. 2) 继续python作死 含树形DP
A - Ostap and Grasshopper zz题能不能跳到 每次只能跳K步 不能跳到# 问能不能T-G 随便跳跳就可以了 第一次居然跳越界0.0 傻子哦 WA1 n,k = map ...
随机推荐
- 2016 版 Laravel 系列入门教程(四)【最适合中国人的 Laravel 教程】
本教程示例代码见: https://github.com/johnlui/Learn-Laravel-5 在任何地方卡住,最快的办法就是去看示例代码. 本篇文章中,我将跟大家一起实现 Article ...
- C基础--C语言的数组
数组的定义: 一.正确写法: 1.int ages[5]--定义了一个5个长度的int类型的数组 2.int ages[]={1,2,3,4,5};--定义了一个5个长度的int类型的数组,并且初始化 ...
- Xunit
Attributes Note: This table was written back when xUnit.net 1.0 has shipped, and needs to be updated ...
- Java设计模式-原型模式(Prototype)
原型模式属于对象的创建模式.通过给出一个原型对象来指明所有创建的对象的类型,然后用复制这个原型对象的办法创建出更多同类型的对象.这就是选型模式的用意. 原型模式的结构 原型模式要求对象实现一个可以“克 ...
- 【Gym 100015A】Another Rock-Paper-Scissors Problem
题 题意 Sonny出石头剪刀布的猜拳策略是 先出R,然后每连续两段都是打败前一段的出拳, 现在问你第n回合打败他要出什么. 分析 他的策略 R P S PSR SRP PSRSRPRPS SRPR ...
- 【BZOJ-1965】SHUFFLE 洗牌 快速幂 + 拓展欧几里德
1965: [Ahoi2005]SHUFFLE 洗牌 Time Limit: 3 Sec Memory Limit: 64 MBSubmit: 541 Solved: 326[Submit][St ...
- MVC传值汇总
方法一: Url传参是通过Get的方式,一般我们都是通过一定规则的Url来传参.比如下面的URL. http://localhost/contorller/action/?Params1=a& ...
- 界面原型Axure
页面原型工具 Axure 超实用页面原型工具.好的页面原型是项目组成员顺利沟通的一个非常重要因素,Axure能快速制作页面原型,还能界面手动式加上事件,链接跳转,弹出层等等一切HTML开发中常用功能, ...
- OpenJudge 7627 鸡蛋的硬度
描述 最近XX公司举办了一个奇怪的比赛:鸡蛋硬度之王争霸赛.参赛者是来自世 界各地的母鸡,比赛的内容是看谁下的蛋最硬,更奇怪的是XX公司并不使用什么精密仪器来测量蛋的硬度,他们采用了一种最老土的办法- ...
- Sublime Text 3 笔记
Nearly all of the interesting files for users live under the data directory. The data directory is ~ ...