Wannafly Camp 2020 Day 2F 采蘑菇的克拉莉丝 - 树链剖分

如果暴力维护,每次询问时需要对所有孩子做计算
考虑通过树剖来平衡修改与询问的时间,询问时计算重链和父树,轻链的贡献预先维护好,修改时则需要修改可能影响的轻链贡献,因为某个点到根的路径上轻重交替只有 \(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 采蘑菇的克拉莉丝 - 树链剖分的更多相关文章
- F 采蘑菇的克拉莉丝
这是一道树链剖分的题目: 很容易想到,我们在树剖后,对于操作1,直接单点修改: 对于答案查询,我们直接的时候,我们假设查询的点是3,那么我们在查询的时候可分为两部分: 第一部分:查找出除3这颗子树以外 ...
- Wannafly Winter Camp 2020 Day 5C Self-Adjusting Segment Tree - 区间dp,线段树
给定 \(m\) 个询问,每个询问是一个区间 \([l,r]\),你需要通过自由地设定每个节点的 \(mid\),设计一种"自适应线段树",使得在这个线段树上跑这 \(m\) 个区 ...
- Wannafly Camp 2020 Day 3I N门问题 - 概率论,扩展中国剩余定理
有一个猜奖者和一个主持人,一共有 \(n\) 扇门,只有一扇门后面有奖,主持人事先知道哪扇门后有奖,而猜奖者不知道.每一轮,猜奖者选择它认为的有奖概率最大(如果有多个最大,随机选一个)的一扇门,主持人 ...
- Wannafly Camp 2020 Day 3F 社团管理 - 决策单调性dp,整体二分
有 \(n\) 个数构成的序列 \({a_i}\),要将它划分为 \(k\) 段,定义每一段的权值为这段中 \((i,j) \ s.t. \ i<j,\ a_i=a_j\) 的个数,求一种划分方 ...
- 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 ...
- 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 ...
- Wannafly Camp 2020 Day 2D 卡拉巴什的字符串 - 后缀自动机
动态维护任意两个后缀的lcp集合的mex,支持在串末尾追加字符. Solution 考虑在 SAM 上求两个后缀的 LCP 的过程,无非就是找它们在 fail 树上的 LCA,那么 LCP 长度就是这 ...
- Wannafly Camp 2020 Day 1D 生成树 - 矩阵树定理,高斯消元
给出两幅 \(n(\leq 400)\) 个点的无向图 \(G_1 ,G_2\),对于 \(G_1\) 的每一颗生成树,它的权值定义为有多少条边在 \(G_2\) 中出现.求 \(G_1\) 所有生成 ...
- Wannafly Camp 2020 Day 2I 堡堡的宝藏 - 费用流
感谢这道题告诉我KM求的是 完备 最大权匹配 :( #include <bits/stdc++.h> using namespace std; #define reset(x) memse ...
随机推荐
- 如何避免FOUC,是如何产生的
FOUC(Flash Of Unstyled Content)即浏览器样式闪烁或者叫做无样式内存闪烁(用户定义样式表加载之前浏览器使用默认样式显示文档,用户样式加载渲染之后再从新显示文档,造成页面闪烁 ...
- Android中四种补间动画的使用示例(附代码下载)
场景 Android中四种补间动画. 透明度渐变动画 旋转动画 缩放动画 平移动画 注: 博客: https://blog.csdn.net/badao_liumang_qizhi关注公众号 霸道的程 ...
- 股票数据获取到了,导入MT4中,是否可以做出很好的量化交易策略呢?
寻找了很久,看到有tushare这个python的类库,但研究了几个小时都没有研究明白,anaconda安装和pycharm的使用都不是特别顺手,最后也是失败告终.还有就是我的低配的平板suerfac ...
- python——异常(1),捕获特定异常
"""1.捕获指定异常,异常类型有多种2.若尝试执行的代码异常类型与捕获的异常类型不同则报错3.try下方一般只放一行代码,若有多行可能异常代码,则捕获一个异常类型后函数 ...
- cf877D
题意简述:矩阵中有的点不能走,你每次可从四个方向走,至少走一步,最多走k步(不能横跨那些不能走的格子),问从(sx,sy)走到(tx,ty)的最短时间是多少? 题意:利用set来加速bfs的过程,原理 ...
- NetCore文件上传校验返回未授权401,文件仍然执行上传操作,要如何解决呢
这是代码:https://files.cnblogs.com/files/suterfo/NetCoreTestPro.rar 运行步骤: 一.使用Visual Studio2017打开项目,并F5运 ...
- 重写了下Ajax请求Webservice,顺便复习一下Javascript的闭包概念
var AjaxRequest = function(){ //返回处理结果的回调函数 this.agentCallBack = {}; //javascript 调用domino代理的方法. thi ...
- 等差数列,for循环,递归和尾递归的对比
生活中,如果1+2+3+4.....+100,大家基本上都会用等差数列计算,如果有人从1开始加,不是傻就是白X,那么程序中呢,是不是也是这样.今天无意中看到了尾递归,以前也写过,但是不知道这个专业名词 ...
- ECharts展示后台数据
/** * Created by Administrator on 2015/11/10 010. */ var home = function () { //项目预警分析 var getProAla ...
- 发布开源项目到Jcenter
前言 为了将阿里云短信开箱即用发布到Jcenter仓库,前前后后花费了1天半的时间,把端午节都搭进去了.终于今天收到了Jcenter的消息,自己发布的包被添加到了Jcenter仓库,也算给开源社区做了 ...