博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
计蒜客NOIP模拟D1T2
阅读量:6988 次
发布时间:2019-06-27

本文共 1189 字,大约阅读时间需要 3 分钟。

原题:

 

蒜头君有一棵有根树,树的每一边都有边权,蒜头君想知道任意两点间最短距离之和为多少。另外,由于各种原因,蒜头君的树的边的边权会发生若干次改变,蒜头君想让你告诉他,每一次改变后,任意两点间最短距离之和为多少?

输入格式

第一行一个正整数 n,表示蒜头君的树上的结点个数。

接下来 n1 行,每行两个正整数xi,yi xi表示i+1 号结点的父亲结点的编号,保证其父结点编号小于自己编号。yi 表示 i+1 号结点的父亲结点与自己间边的距离。

接下来一行一个整数 m,表示树的边权发生改变的次数。

接下来 m 行,每行两个正整数 a,b,表示将 a结点与其父亲结点之间的距离改为b,保证 a2

输出格式

先输出一个整数,表示对于原始的树任意两点间最短距离之和。

接下来 m 行,每行输出一个整数,表示每一次改变后,任意两点间最短距离之和。

数据规模

 

样例输入

4
1 1
1 1
1 1
1
2 2

样例输出

9
12

 

开始在想LCA啥的[某个人气急败坏的要树剖]但是肯定TLE

虽然研究了一道类似的题解

但最后还是自己写出来了[类似的→hdu2376]
就是给一棵树然后求任意两点的最短距离之和。然后给m次修改重新求和。
方法是每一条边的两段的节点个数相乘[乘法原理]然后再乘上边权。就是计算每条边被经过的次数。
中间的逻辑一定要推理明白。这道题出题人还是很良心的。每次给的都是这条边底下的节点,对于计算方便很多。
m次修改就很好计算了。将这条边的边权修改,把原来的减去再加上现在的即可。

这题因为写反了一个循环所以爆零了。好忧伤。

但是只有经历了爆零才能重获新生吧。

不想多说了。上代码hhhhh。

#include
#include
#include
using namespace std;int fa[100000];long long sum[100000],bian[100000];int main(){int n,m,j,i,k,w,e,s;long long ans;scanf("%d",&n);for(i=2;i<=n;i++){scanf("%d%lld",&fa[i],&bian[i]);sum[i]=1;}for(i=n;i>=2;i--)//这个循环要是逆序因为前面的要依赖后面的{sum[fa[i]]+=sum[i];}ans=0;for(i=1;i<=n;i++){ans+=bian[i]*sum[i]*(n-sum[i]);}printf("%lld\n",ans);scanf("%d",&m);for(i=0;i

 

转载于:https://www.cnblogs.com/hanyuweining/p/10321989.html

你可能感兴趣的文章
我的友情链接
查看>>
linux系统批量修改root用户密码
查看>>
我的shell×××作
查看>>
天猫超市低调运营 马云尝试自营B2C模式
查看>>
选择Palo Alto 防火墙十大理由
查看>>
Linux下解压,压缩JAR包的简单方法
查看>>
领先盘点2013年办公家具风格潮流趋势
查看>>
分布式事务:两阶段提交与三阶段提交
查看>>
linux deepin升级内核后,vmware需要gcc编译器
查看>>
针对IE6\7\8\9\10浏览器的CSS hack大全详解
查看>>
网站检测空链、死链工具(Xenu)
查看>>
Java Web学习总结(5)——HttpServletResponse对象详解
查看>>
Myeclipse常用快捷键
查看>>
热备份路由协议(HSRP)与生成树协议(TCP)
查看>>
C++应用程序性能优化(二)——C++对象模型
查看>>
smarty 中一些方法的使用
查看>>
大型网站技术架构(五)网站高可用架构
查看>>
《简明 Python 教程》笔记-----基础知识
查看>>
Maven学习总结(五)——聚合与继承
查看>>
LNMP架构 源码安装nginx+mysql+php+memcache+论坛
查看>>