LINK

首先有一个很nativenativenative的想法

因为一个节点到父亲节点的边是容易统计贡献的,只需要算出不在子树内的蘑菇数量即可

现在只需要统计子树内蘑菇的贡献即可

当vvv节点加上xxx个蘑菇时,把根节点111到vvv的路径上都加上111

那么只需要枚举节点到所有儿子的边,就可以算了

这样会被菊花图卡掉

考虑优化

我们把vvv到根节点111路径上的点都加上xxx时,不断从重链跳到另一条重链去

所以,我们就把重链和重链间的那条轻边统计答案到它的父亲去

这样一来,途中的所有轻儿子的贡献都被累加到父亲节点了

所以我们只需要计算重儿子贡献即可

#include <bits/stdc++.h>
using namespace std;
#define int long long
#define ls (rt<<1)
#define rs (rt<<1|1)
#define mid (l+r>>1)
#define lson ls,l,mid
#define rson rs,mid+1,r
const int maxn = 4e6+10;
int n,deep[maxn],siz[maxn],fa[maxn],ans[maxn],w[maxn],son[maxn];
struct edge{int to,nxt,w;
}d[maxn]; int head[maxn],cnt=1;
void Add(int u,int v,int w){ d[++cnt] = (edge){v,head[u],w},head[u] = cnt; }
void dfs1(int u,int father)
{deep[u] = deep[father]+1, siz[u] = 1; fa[u] = father;for(int i=head[u];i;i=d[i].nxt ){int v = d[i].to;if( v==father ) continue;dfs1(v,u); w[v] = d[i].w;siz[u] += siz[v];if( siz[v]>siz[son[u]] )   son[u] = v;}
}
int dfu,dfn[maxn],top[maxn];
void dfs2(int u,int ffa)
{dfn[u] = ++dfu; top[u] = ffa;if( son[u] )  dfs2(son[u],ffa);for(int i=head[u];i;i=d[i].nxt ){int v = d[i].to;if( v==fa[u] || v==son[u] )    continue;dfs2(v,v);}
}
int laz[maxn],a[maxn];
void pushdown(int rt,int l,int r)
{if( laz[rt]==0 ) return;laz[ls] += laz[rt], laz[rs] += laz[rt];a[ls] += laz[rt]*(mid-l+1);a[rs] += laz[rt]*(r-mid);laz[rt] = 0;
}
void add(int rt,int l,int r,int L,int R,int val)
{if( l>R||r<L )   return;if( l>=L&&r<=R ){ laz[rt]+=val,a[rt]+=val*(r-l+1); return; }pushdown(rt,l,r);add(lson,L,R,val); add(rson,L,R,val);a[rt] = a[ls]+a[rs];
}
int ask(int rt,int l,int r,int L,int R)
{if( l>R||r<L )   return 0;if( l>=L&&r<=R )   return a[rt];pushdown(rt,l,r);return ask(lson,L,R)+ask(rson,L,R);
}
signed main()
{cin >> n;for(int i=1;i<n;i++){int l,r,w; scanf("%lld%lld%lld",&l,&r,&w);Add(l,r,w); Add(r,l,w);}dfs1(1,0); dfs2(1,1);int q,s=1,tot=0; cin >> q;while( q-- ){int type; scanf("%lld",&type);if( type==1 ){int v,x,u=1; scanf("%lld%lld",&v,&x);tot += x;//把v到根节点的所有边都加上xwhile( top[v]!=top[u] ){if( deep[ top[v] ]<deep[ top[u] ] )   swap(v,u);//保证v深度大add(1,1,n,dfn[ top[v] ],dfn[v],x ); ans[fa[top[v]]] += x*w[top[v]];v = fa[top[v]];//跳到另一条重链上去 }if( deep[v]>deep[u] )    swap(v,u);add(1,1,n,dfn[v],dfn[u],x );}else scanf("%lld",&s);int now = ans[s];//轻儿子节点 if( son[s] )   now += w[son[s]]*ask(1,1,n,dfn[son[s]],dfn[son[s]] );//重儿子节点 now += w[s]*( tot-ask(1,1,n,dfn[s],dfn[s]) );//父亲节点 cout << now << endl;}
}

2020 CCPC Wannafly F.采蘑菇的克拉莉丝(轻重链的应用)相关推荐

  1. 采蘑菇的克拉莉丝(树链剖分)

    采蘑菇的克拉莉丝 一个有点意思的树链剖分的题. 题意: 一棵树,有两种操作: ①:在点vvv放xxx个蘑菇. ②:将起点变为vvv. 每次计算收集所有蘑菇的代价. 收集蘑菇的代价为,起点到所在蘑菇的路 ...

  2. 2020 CCPC Changchun F :Strange Memory dsu on tree

    传送门 分析 一开始读错题了,以为是个算贡献的水题... 树上静态统计,考虑dfsuontreedfsu \ on \ treedfsu on tree,我们去维护每一个值对应每一个二进制位出现了多少 ...

  3. 2020 CCPC Wannafly Winter Camp Day3 部分题解(ACEFG)

    查看题目 A 黑色气球 题意: n个气球,每个气球高度为正整数.给你每两个气球之间的高度和,还原出所有气球的高度,保证答案唯一. 解题思路: 签到题,因为高度的范围不大,直接枚举第一个气球的高度,检测 ...

  4. 2020 CCPC Wannafly Winter Camp Day2 Div.12——A 托米的字符串【构造、数学】

    题目传送门 题目描述 托米有一个字符串,他经常拿出来玩.这天在英语课上,他学习了元音字母 a , e , i , o , u {a,e,i,o,u} a,e,i,o,u 以及半元音 y {y} y . ...

  5. 阔力梯的树(2020 CCPC Wannafly Winter Camp Day2 Div.12 )dsu on tree

    题解: dsu on tree dsu on tree的基本步骤就不说了 看到这题询问结点的子树问题,而且询问时离线的,首先想到的dsu on tree的这个trick. 本题的难题就是如何维护结点所 ...

  6. 2020 CCPC Wannafly Winter Camp Day6 M—自闭——模拟

    链接:https://ac.nowcoder.com/acm/contest/4137/M 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言524 ...

  7. 2020 CCPC Wannafly Winter Camp Day7 K 修炼

    题意: 一个游戏,规则如下: 有六个值 v 1 , v 2 , a 1 , a 2 , b 1 , b 2 v_1,v_2,a_1,a_2,b_1,b_2 v1​,v2​,a1​,a2​,b1​,b2 ...

  8. 2020 ccpc 吉林省赛 H

    2020 ccpc 吉林省赛 H 题意: 给一组数 a i a_i ai​,求 ∑ i = 1 n ∑ j = 1 n [ g c d ( a i , a j ) = d ] \sum\limits_ ...

  9. 【Foreign】采蘑菇 [点分治]

    采蘑菇 Time Limit: 20 Sec  Memory Limit: 256 MB Description Input Output Sample Input 5 1 2 3 2 3 1 2 1 ...

最新文章

  1. Leetcode 234. 回文链表 解题思路及C++实现
  2. android - FlutterActivity MethodChannel和FlutterView
  3. python函数递归年龄_Python学习笔记4-递归函数
  4. [Python图像处理] 二十三.傅里叶变换之高通滤波和低通滤波
  5. 每天进步一点点《SVD用于压缩》
  6. 蹭热度?罗永浩:下一个创业项目是“元宇宙公司”
  7. python语言能做什么-python语言能做什么
  8. 联邦学习在光大科技的落地应用
  9. 时区时钟插件html,日期、时间选择控件 - datetimepicker
  10. SWMM代码移植到64位平台
  11. 微信小程序人脸识别之人脸属性检测
  12. 【muduo】TcpClient与TcpServer建立连接过程对比
  13. theano java_Theano多个张量作为输出
  14. 大数据之Atlas元数据管理
  15. 音效管理android,Android之声音管理器《AudioManager》的使用以及音量控制
  16. 思维模型 三明治法则
  17. 古月居 ROS 入门21讲--PA18 tf坐标系广播与监听的编程实现笔记
  18. ADS 修改绘图单位
  19. STM32配置读取BMP280气压传感器数据
  20. 通过okHttpUtils实现文件的上传下载

热门文章

  1. 小波阈值滤波和VMD分解的对比输入一段语音信号,加入不同信噪比的噪声,单独使用小波阈滤波
  2. 互联网帮助人们太空行走,有成功和失败
  3. selenium爬取淘宝商品基础数据以及商品详情(茶叶数据)
  4. 有效延缓近视度数加深!青少年近视防控你了解么?
  5. 数字城市防汛应急,Web GIS 可视化布局
  6. Java 替换字符串中空格的三种方法
  7. android sdk救机,android如何使用adb(android sdk)操作进行双清双wipe?在线求救~~~~~~~
  8. 求职记录【又名求职杯具史】~
  9. 『开心乐园』[幽默笑话][精] 爆笑:把女友升级为老婆时发生的BUG!!!(转载)
  10. 推荐系统算法(MF、FM、CF、SVD、LFM、SVD++、TItemCF、timeSVD++、模型融合)