蒜头君的树
来源:互联网 发布:江苏凤凰数据有限公司 编辑:程序博客网 时间:2024/05/16 18:35
蒜头君的树
题解
先存图,再dfs,dfs的过程中统计以x点为子树的点的总数cnt[x],这样可以求出来x和fa[x]连的这条边一共被使用了(n-cnt[x])*cnt[x]次
再求出来最短路之和tot(因为是树,所以最短路好求),对于每次修改,只需要将将差乘上使用次数就好了
#include<iostream>#include<cstdio>using namespace std;long long x,n,y,fa[1000001],m,e,head[1000001],cnt[100001],dis[100001];long long tot;struct node{long long from,to,cost,nxt;}a[1000001];void add(long long f,long long t,long long w){ e++; a[e].to=t; a[e].from=f; a[e].cost=w; a[e].nxt=head[f]; head[f]=e;}void dfs(long long x){ for(long long i=head[x];i;i=a[i].nxt) { long long t=a[i].to; if(t!=fa[x]) { dfs(t); cnt[x]+=cnt[t]; tot+=(n-cnt[t])*cnt[t]*a[i].cost; } } cnt[x]++;}int main(){// freopen("1.txt","r",stdin); cin>>n;fa[1]=1; for(long long i=1;i<=n-1;i++) { scanf("%lld%lld",&x,&dis[i+1]); fa[i+1]=x; add(i+1,x,dis[i+1]); add(x,i+1,dis[i+1]); } dfs(1); printf("%lld\n",tot); cin>>m; for(long long i=1;i<=m;i++) { scanf("%lld%lld",&x,&y); tot+=(y-dis[x])*cnt[x]*(n-cnt[x]); dis[x]=y; printf("%lld\n",tot); }}
吧啦吧啦吧啦吧啦吧啦吧啦吧啦吧啦吧啦
阅读全文
0 0
- 蒜头君的树
- 蒜头君的树
- 蒜头君的坐骑
- 蒜头君的兔子
- 蒜头君的排序
- 蒜头君的玩具娃娃
- 二叉搜索树之蒜头君的新技能
- 计蒜客 蒜头君的随机数,造房子
- 蒜头君吃桃子
- 蒜头君打老鼠
- 蒜头君救人
- 蒜头君的排序(树状数组维护逆序对)
- 计蒜课 蒜头君走迷宫
- 计蒜客 蒜头君学英语
- 蒜头君救人 状压DP
- 计蒜客NOIP提高组模拟Day2,Pro1蒜头君的兔子
- 蒜头君开公司【全排列】
- 蒜头君学代数(二分)
- 2017多校联合第二场 1008题 hdu 6052 To my boyfriend 计数 单调队列
- hdu5273 Abandoned country 最小生成树 概率 Kruskal算法 前向星存图
- tensorflow训练cnn网络实现避障与导航(二)V-rep仿真环境的搭建
- the way
- 使用pip默认源下载慢,修改为国内源
- 蒜头君的树
- 单轨迹传感器巡线
- PHP与ajax的长轮询
- 阿里云效团队大规模代码构建技术实践
- 学习ORACLE Scheduler特性(8)Application抛出的Events
- 1034. 有理数四则运算
- 容能科技亮相宝博会 全云能力助力企业互联网+
- 谈谈数据库连接池的原理
- 南京邮电大学网络攻防平台逆向writeup之[maze]