题意

见原题

题解

重链剖分模板题

#include <cstdio>
#include <algorithm>
using std::swap;
typedef long long ll; const int N = 1e5 + 10;
int n, m, c[N], opt, x, y;
int dep[N], siz[N], fa[N], son[N];
int top[N], dfn[N], w[N], time;
int cnt, from[N], to[N << 1], nxt[N << 1];
ll val[N << 2], add[N << 2];
inline void addEdge(int u, int v){
to[++cnt] = v, nxt[cnt] = from[u], from[u] = cnt;
} void dfs1(int u) {
dep[u] = dep[fa[u]] + 1, siz[u] = 1;
for (int i = from[u]; i; i = nxt[i]) {
int v = to[i]; if(v == fa[u]) continue;
fa[v] = u, dfs1(v), siz[u] += siz[v];
if(siz[v] > siz[son[u]]) son[u] = v;
}
}
void dfs2(int u, int t) {
top[u] = t, dfn[u] = ++time, w[time] = c[u];
if(!son[u]) return ; dfs2(son[u], t);
for(int i = from[u]; i; i = nxt[i]) {
int v = to[i];
if(v != fa[u] && v != son[u])
dfs2(v, v);
}
} inline void pushup(int o, int lc, int rc) {
val[o] = val[lc] + val[rc];
}
inline void pushdown(int o, int lc, int rc, int len) {
if(add[o]) {
add[lc] += add[o], add[rc] += add[o];
val[lc] += add[o] * (len - (len >> 1));
val[rc] += add[o] * (len >> 1);
add[o] = 0;
}
}
void build(int o = 1, int l = 1, int r = n) {
if(l == r) { val[o] = w[l]; return ; }
int mid = (l + r) >> 1, lc = o << 1, rc = lc | 1;
build(lc, l, mid), build(rc, mid + 1, r), pushup(o, lc, rc);
}
void upt(int ul, int ur, ll k, int o = 1, int l = 1, int r = n) {
if (l >= ul && r <= ur) {
add[o] += k, val[o] += k * (r - l + 1);
return ;
}
int mid = (l + r) >> 1, lc = o << 1, rc = lc | 1;
pushdown(o, lc, rc, r - l + 1);
if(ul <= mid) upt(ul, ur, k, lc, l, mid);
if(ur > mid) upt(ul, ur, k, rc, mid + 1, r);
pushup(o, lc, rc);
}
ll que(int ql, int qr, int o = 1, int l = 1, int r = n) {
if (l >= ql && r <= qr) return val[o];
int mid = (l + r) >> 1, lc = o << 1, rc = lc | 1; ll ret = 0;
pushdown(o, lc, rc, r - l + 1);
if(ql <= mid) ret = que(ql, qr, lc, l, mid);
if(qr > mid) ret += que(ql, qr, rc, mid + 1, r);
return ret;
} ll sum(int x) {
int fx = top[x]; ll ret = 0;
while (fx != 1) ret += que(dfn[fx], dfn[x]), x = fa[fx], fx = top[x];
return ret + que(1, dfn[x]);
} int main () {
scanf("%d%d", &n, &m);
for (int i = 1; i <= n; ++i) scanf("%d", c + i);
for (int i = 1, u, v; i < n; ++i) {
scanf("%d%d", &u, &v);
addEdge(u, v), addEdge(v, u);
}
dfs1(1), dfs2(1, 1), build();
while(m--) {
scanf("%d%d", &opt, &x);
if (opt == 3) printf("%lld\n", sum(x));
else {
scanf("%d", &y);
if (opt == 1) upt(dfn[x], dfn[x], y);
else upt(dfn[x], dfn[x] + siz[x] - 1, y);
}
}
return 0;
}

Luogu P3178 树上操作(树链剖分+线段树)的更多相关文章

  1. BZOJ.4034 [HAOI2015]树上操作 ( 点权树链剖分 线段树 )

    BZOJ.4034 [HAOI2015]树上操作 ( 点权树链剖分 线段树 ) 题意分析 有一棵点数为 N 的树,以点 1 为根,且树点有边权.然后有 M 个 操作,分为三种: 操作 1 :把某个节点 ...

  2. 【BZOJ-2325】道馆之战 树链剖分 + 线段树

    2325: [ZJOI2011]道馆之战 Time Limit: 40 Sec  Memory Limit: 256 MBSubmit: 1153  Solved: 421[Submit][Statu ...

  3. BZOJ2243 (树链剖分+线段树)

    Problem 染色(BZOJ2243) 题目大意 给定一颗树,每个节点上有一种颜色. 要求支持两种操作: 操作1:将a->b上所有点染成一种颜色. 操作2:询问a->b上的颜色段数量. ...

  4. 【POJ3237】Tree(树链剖分+线段树)

    Description You are given a tree with N nodes. The tree’s nodes are numbered 1 through N and its edg ...

  5. B20J_3231_[SDOI2014]旅行_树链剖分+线段树

    B20J_3231_[SDOI2014]旅行_树链剖分+线段树 题意: S国有N个城市,编号从1到N.城市间用N-1条双向道路连接,城市信仰不同的宗教,为了方便,我们用不同的正整数代表各种宗教. S国 ...

  6. 洛谷P4092 [HEOI2016/TJOI2016]树 并查集/树链剖分+线段树

    正解:并查集/树链剖分+线段树 解题报告: 传送门 感觉并查集的那个方法挺妙的,,,刚好又要复习下树剖了,所以就写个题解好了QwQ 首先说下并查集的方法趴QwQ 首先离线,读入所有操作,然后dfs遍历 ...

  7. BZOJ4551[Tjoi2016&Heoi2016]树——dfs序+线段树/树链剖分+线段树

    题目描述 在2016年,佳媛姐姐刚刚学习了树,非常开心.现在他想解决这样一个问题:给定一颗有根树(根为1),有以下 两种操作:1. 标记操作:对某个结点打上标记(在最开始,只有结点1有标记,其他结点均 ...

  8. BZOJ2325[ZJOI2011]道馆之战——树链剖分+线段树

    题目描述 口袋妖怪(又名神奇宝贝或宠物小精灵)红/蓝/绿宝石中的水系道馆需要经过三个冰地才能到达馆主的面前,冰地中 的每一个冰块都只能经过一次.当一个冰地上的所有冰块都被经过之后,到下一个冰地的楼梯才 ...

  9. fzu 2082 过路费 (树链剖分+线段树 边权)

    Problem 2082 过路费 Accept: 887    Submit: 2881Time Limit: 1000 mSec    Memory Limit : 32768 KB  Proble ...

  10. 【bzoj5210】最大连通子块和 树链剖分+线段树+可删除堆维护树形动态dp

    题目描述 给出一棵n个点.以1为根的有根树,点有点权.要求支持如下两种操作: M x y:将点x的点权改为y: Q x:求以x为根的子树的最大连通子块和. 其中,一棵子树的最大连通子块和指的是:该子树 ...

随机推荐

  1. ZOJ 3556 How Many Sets I

    How Many Sets I Time Limit: 2 Seconds      Memory Limit: 65536 KB Give a set S, |S| = n, then how ma ...

  2. Desert King(POJ2728+最优比率生成树+二分)

    题目链接:http://poj.org/problem?id=2728 题目: 题意:求一颗生成树,使得费用与距离的比值最小,其中距离等于两点之间的平面欧拉距离,费用为z坐标之差. 思路: 由上图我们 ...

  3. 24、redis中的sentinel的作用?

    redis中的sentinel的作用? Redis-Sentinel是Redis官方推荐的高可用性(HA)解决方案,当用Redis做Master-slave的高可用方案时,假如master宕机了,Re ...

  4. hdu 1087 Super Jumping! Jumping! Jumping!(动态规划DP)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1087 Super Jumping! Jumping! Jumping! Time Limit: 200 ...

  5. 在AndroidStudio中导入开源库 或者jar

    方法一: 先点击Androidstudio中的Project Structure,如图 图1 到如下界面 图2 然后点击+号 图3 选择Library dependency 图4 输入你要的jar包, ...

  6. Coursera在线学习---第八节.K-means聚类算法与主成分分析(PCA)

    一.K-means聚类中心初始化问题. 1)随机初始化各个簇类的中心,进行迭代,直到收敛,并计算代价函数J. 如果k=2~10,可以进行上述步骤100次,并分别计算代价函数J,选取J值最小的一种聚类情 ...

  7. hdfs文件上传机制与namenode元数据管理机制

    1.hdfs文件上传机制 文件上传过程:   1.客户端想NameNode申请上传文件, 2.NameNode返回此次上传的分配DataNode情况给客户端 3.客户端开始依向dataName上传对应 ...

  8. 任务调度框架kunka

    kunka kunka是一个任务调度框架.用户只需要在Task接口中实现自己要执行的功能,并且选择合适的执行器,放入TaskManager中,就可以了完成整个任务了. 实现细节 整个任务信息存放在内存 ...

  9. python基础===monkeytype可以自动添加注释的模块!

    monkeytype 一个可以自动添加注释的模块! 先要下载: pip install monkeytype 以官网的sample code为例 #moudle.py def add(a, b): r ...

  10. 如何在苹果官网下载旧版本的Xcode

    如何在苹果官网下载旧版本的Xcode 前段时间XcodeGhost事件让很多应用中招,不乏一些知名的互联网公司开发的应用.事件的起因是开发者使用了非官方的Xcode,这些Xcode带有xcodegho ...