如果暴力维护,每次询问时需要对所有孩子做计算

考虑通过树剖来平衡修改与询问的时间,询问时计算重链和父树,轻链的贡献预先维护好,修改时则需要修改可能影响的轻链贡献,因为某个点到根的路径上轻重交替只有 \(O(\log n)\) 个,所以只需要修改这么多次,于是复杂度有保证,树状数组维护子树即可

我真是个憨憨,打错树剖调一晚,地上蛙血一大摊

#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 1e6+5; int ar[N]; // index: 1 ~ N
int lowbit(int t) { return t & (-t); }
void add(int i, int v) {
for (; i < N; ar[i] += v, i += lowbit(i));
}
void add(int i, int j, int v) {
add (j+1, -v);
add (i, v);
}
int sum(int i) {
int s = 0;
for (; i > 0; s += ar[i], i -= lowbit(i));
return s;
} vector <pair<int,int> > g[N];
int n,m,t1,t2,t3,pos;
int fa[N],siz[N],f[N],cnt[N],wson[N],len[N],dfn[N],top[N],ind,tot; void dfs1(int p) {
siz[p]=1;
for(pair<int,int> pr:g[p]) {
int q=pr.first, w=pr.second;
if(q==fa[p]) continue;
fa[q]=p;
len[q]=w;
dfs1(q);
siz[p]+=siz[q];
if(siz[q]>siz[wson[p]]) wson[p]=q;
}
} void dfs2(int p) {
dfn[p]=++ind;
if(wson[p]) {
top[wson[p]]=top[p];
dfs2(wson[p]);
}
for(pair<int,int> pr:g[p]) {
int q=pr.first, w=pr.second;
if(q==fa[p]) continue;
if(q==wson[p]) continue;
top[q]=q;
dfs2(q);
}
} void modify(int v,int x) {
cnt[v]+=x;
//v=fa[v];
while(v) {
int t=top[v];
add(dfn[t],dfn[v],x);
f[fa[t]]+=x*len[t];
v=fa[t];
}
f[0]=0;
} int query(int p) {
int ans=0;
ans+=sum(dfn[wson[p]])*len[wson[p]];
ans+=f[p];
ans+=len[p]*(tot-sum(dfn[p]));
//cout<<sum(dfn[wson[p]])<<"*"<<len[wson[p]]<<" + "<<
//f[p]<<" + "<<len[p]<<"*"<<(tot-sum(dfn[p]))<<" = "<<ans<<endl;
return ans;
} signed main() {
scanf("%lld",&n);
for(int i=1;i<n;i++) {
scanf("%lld%lld%lld",&t1,&t2,&t3);
g[t1].push_back(make_pair(t2,t3));
g[t2].push_back(make_pair(t1,t3));
}
dfs1(1);
top[1]=1;
dfs2(1);
pos=1;
scanf("%lld",&m);
for(int i=1;i<=m;i++) {
scanf("%lld%lld",&t1,&t2);
if(t1==1) scanf("%lld",&t3), tot+=t3;
if(t1==1) modify(t2,t3);
else pos=t2;
printf("%lld\n",query(pos));
}
}

Wannafly Camp 2020 Day 2F 采蘑菇的克拉莉丝 - 树链剖分的更多相关文章

  1. F 采蘑菇的克拉莉丝

    这是一道树链剖分的题目: 很容易想到,我们在树剖后,对于操作1,直接单点修改: 对于答案查询,我们直接的时候,我们假设查询的点是3,那么我们在查询的时候可分为两部分: 第一部分:查找出除3这颗子树以外 ...

  2. Wannafly Winter Camp 2020 Day 5C Self-Adjusting Segment Tree - 区间dp,线段树

    给定 \(m\) 个询问,每个询问是一个区间 \([l,r]\),你需要通过自由地设定每个节点的 \(mid\),设计一种"自适应线段树",使得在这个线段树上跑这 \(m\) 个区 ...

  3. Wannafly Camp 2020 Day 3I N门问题 - 概率论,扩展中国剩余定理

    有一个猜奖者和一个主持人,一共有 \(n\) 扇门,只有一扇门后面有奖,主持人事先知道哪扇门后有奖,而猜奖者不知道.每一轮,猜奖者选择它认为的有奖概率最大(如果有多个最大,随机选一个)的一扇门,主持人 ...

  4. Wannafly Camp 2020 Day 3F 社团管理 - 决策单调性dp,整体二分

    有 \(n\) 个数构成的序列 \({a_i}\),要将它划分为 \(k\) 段,定义每一段的权值为这段中 \((i,j) \ s.t. \ i<j,\ a_i=a_j\) 的个数,求一种划分方 ...

  5. Wannafly Camp 2020 Day 3D 求和 - 莫比乌斯反演,整除分块,STL,杜教筛

    杜教筛求 \(\phi(n)\), \[ S(n)=n(n+1)/2-\sum_{d=2}^n S(\frac{n}{d}) \] 答案为 \[ \sum_{d=1}^n \phi(d) h(\fra ...

  6. Wannafly Camp 2020 Day 2B 萨博的方程式 - 数位dp

    给定 \(n\) 个数 \(m_i\),求 \((x_1,x_2,...,x_n)\) 的个数,使得 \(x_1 \ xor\ x_2\ xor\ ...\ xor\ x_n = k\),且 \(0 ...

  7. Wannafly Camp 2020 Day 2D 卡拉巴什的字符串 - 后缀自动机

    动态维护任意两个后缀的lcp集合的mex,支持在串末尾追加字符. Solution 考虑在 SAM 上求两个后缀的 LCP 的过程,无非就是找它们在 fail 树上的 LCA,那么 LCP 长度就是这 ...

  8. Wannafly Camp 2020 Day 1D 生成树 - 矩阵树定理,高斯消元

    给出两幅 \(n(\leq 400)\) 个点的无向图 \(G_1 ,G_2\),对于 \(G_1\) 的每一颗生成树,它的权值定义为有多少条边在 \(G_2\) 中出现.求 \(G_1\) 所有生成 ...

  9. Wannafly Camp 2020 Day 2I 堡堡的宝藏 - 费用流

    感谢这道题告诉我KM求的是 完备 最大权匹配 :( #include <bits/stdc++.h> using namespace std; #define reset(x) memse ...

随机推荐

  1. Java连载89-SorteSet、Comparable接口

    一. SortedSet集合直接举例 package com.bjpowernode.java_learning; import java.util.*; /** * java.util.Set * ...

  2. CMD命令下图片合成一句话木马命令

    非常简单,我们只需要一张图片1.jpg一句话木马写好的php文件 1.php之后我们进入到命令行.注意:将php文件和图片文件放到同一目录下,cmd也要跳转到放文件的目录下之后执行命令 copy .j ...

  3. Integer使用==做判断遇到的问题

    问题: 最近使用Integer类型的数据做判断时,遇到了一个神奇的问题. 如: Integer a=223; Integer b=223; 这样使用==做判断,得到的结果是 false 原因: 后来查 ...

  4. 应用场景不同,是无代码和低代码的最大区别 ZT

    随着媒体对低代码.无代码等先进技术的持续关注,我们发现大多数人都听说过低代码开发和无代码开发这两个概念,但是对两者之间的区别其实并不清楚.事实上,低代码开发和无代码开发之间存在着很多非常显著的差异,如 ...

  5. Asp.ner Core-Blazor随手记

    后续继续补充内容.... 1.安装.Net Core3.0 SDK及以上版本都有待Blazor 2.如果想在.razor页面直接使用C#代码,相当于html里面嵌入了C#代码,可以在命令行里面输入下面 ...

  6. css的网页布局案例

    常见行布局: 导航使用position:fixed固定住 导航会脱离文档流,不占据空间 导致下面的元素上移,因此需要将下面的元素的padding-top设置成导航的高度 <!DOCTYPE ht ...

  7. CSS语法、选择器、继承、层叠

    行内样式(内联样式) <h1 style="color:red;font-size:20px;">css行内样式</h1> 内部样式表(嵌入样式) < ...

  8. MySQL架构和MySQL索引

    1.  MySQL架构 1.1         逻辑架构图 1.1.1   Connection Pool: 连接池 * 管理缓冲用户连接,线程处理等需要缓存的需求. * 负责监听对 MySQL Se ...

  9. 获取WEB图片

    public string GetJpgFile(string strFileServerPath ,string strReportDir) { string strPath = "&qu ...

  10. Python 用户输入&while循环 初学者笔记

    input() 获取用户输入(获取的都是字符串哦) //函数input()让程序停止运行,等待用户输入一些文本. //不同于C的是可在input中添加用户提示,而scanf不具备这一特性. //提示超 ...