题意:

给出一棵树,每个顶点上有一个权值。

操作:选择一条路径,并将路径上所有的点的权值同时加或减某个数。

查询:某个点的当前权值

分析:

树链剖分完毕后,就是简单的线段树区间更新。

提交的时候注意要要加一句扩栈的代码,用C++提交。

 #include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std; void read(int& x) {
x = ;
char c = ' ';
while(c < '' || c > '') c = getchar();
while('' <= c && c <= '') {
x = x * + c - '';
c = getchar();
}
} const int maxn = + ;
const int maxnode = maxn * ; struct Edge
{
int v, nxt;
Edge() {}
Edge(int v, int nxt) :v(v), nxt(nxt) {}
}; int n, m, q;
int a[maxn]; int ecnt, head[maxn];
Edge edges[maxn * ]; void AddEdge(int u, int v) {
edges[++ecnt] = Edge(v, head[u]);
head[u] = ecnt;
edges[++ecnt] = Edge(u, head[v]);
head[v] = ecnt;
} int dep[maxn], fa[maxn], son[maxn], sz[maxn]; int tot, id[maxn], pos[maxn], top[maxn]; void dfs(int u) {
sz[u] = ; son[u] = -;
for(int i = head[u]; i; i = edges[i].nxt) {
int v = edges[i].v;
if(v == fa[u]) continue;
fa[v] = u;
dep[v] = dep[u] + ;
dfs(v);
sz[u] += sz[v];
if(son[u] == - || sz[v] > sz[son[u]]) son[u] = v;
}
} void dfs2(int u, int tp) {
top[u] = tp;
id[u] = ++tot;
pos[tot] = u;
if(son[u] == -) return;
if(son[u]) dfs2(son[u], tp);
for(int i = head[u]; i; i = edges[i].nxt) {
int v = edges[i].v;
if(v == fa[u] || v == son[u]) continue;
dfs2(v, v);
}
} int sumv[maxnode], addv[maxnode];
char cmd[]; void pushup(int o) { sumv[o] = sumv[o<<] + sumv[o<<|]; } void build(int o, int L, int R) {
if(L == R) { sumv[o] = a[pos[L]]; return; }
int M = (L + R) / ;
build(o<<, L, M);
build(o<<|, M+, R);
pushup(o);
} void pushdown(int o, int L, int R) {
if(addv[o]) {
addv[o<<] += addv[o];
addv[o<<|] += addv[o];
int M = (L + R) / ;
sumv[o<<] += (M - L + ) * addv[o];
sumv[o<<|] += (R - M) * addv[o];
addv[o] = ;
}
} void update(int o, int L, int R, int qL, int qR, int v) {
if(qL <= L && R <= qR) {
sumv[o] += (R - L + ) * v;
addv[o] += v;
return;
}
pushdown(o, L, R);
int M = (L + R) / ;
if(qL <= M) update(o<<, L, M, qL, qR, v);
if(qR > M) update(o<<|, M+, R, qL, qR, v);
pushup(o);
} void UPDATE(int u, int v, int val) {
int t1 = top[u], t2 = top[v];
while(t1 != t2) {
if(dep[t1] < dep[t2]) { swap(u, v); swap(t1, t2); }
update(, , n, id[t1], id[u], val);
u = fa[t1]; t1 = top[u];
}
if(dep[u] > dep[v]) swap(u, v);
update(, , n, id[u], id[v], val);
} int query(int o, int L, int R, int p) {
if(L == R) return sumv[o];
pushdown(o, L, R);
int M = (L + R) / ;
if(p <= M) return query(o<<, L, M, p);
else return query(o<<|, M+, R, p);
} int main()
{
while(scanf("%d%d%d", &n, &m, &q) == ) {
for(int i = ; i <= n; i++) read(a[i]); memset(head, , sizeof(head));
ecnt = ;
for(int i = ; i < n; i++) {
int u, v; read(u); read(v);
AddEdge(u, v);
} dfs();
tot = ;
dfs2(, ); memset(addv, , sizeof(addv));
build(, , n); while(q--) {
scanf("%s", cmd);
int u, v, d;
read(u);
if(cmd[] == 'Q') {
printf("%d\n", query(, , n, id[u]));
} else {
read(v); read(d);
if(cmd[] == 'D') d = -d;
UPDATE(u, v, d);
}
}
} return ;
}

代码君

HDU 3966 RE 树链剖分 线段树 Aragorn's Story的更多相关文章

  1. HDU 2460 Network(双连通+树链剖分+线段树)

    HDU 2460 Network 题目链接 题意:给定一个无向图,问每次增加一条边,问个图中还剩多少桥 思路:先双连通缩点,然后形成一棵树,每次增加一条边,相当于询问这两点路径上有多少条边,这个用树链 ...

  2. Aragorn's Story 树链剖分+线段树 && 树链剖分+树状数组

    Aragorn's Story 来源:http://www.fjutacm.com/Problem.jsp?pid=2710来源:http://acm.hdu.edu.cn/showproblem.p ...

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

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

  4. 【BZOJ2243】[SDOI2011]染色 树链剖分+线段树

    [BZOJ2243][SDOI2011]染色 Description 给定一棵有n个节点的无根树和m个操作,操作有2类: 1.将节点a到节点b路径上所有点都染成颜色c: 2.询问节点a到节点b路径上的 ...

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

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

  6. POJ3237 (树链剖分+线段树)

    Problem Tree (POJ3237) 题目大意 给定一颗树,有边权. 要求支持三种操作: 操作一:更改某条边的权值. 操作二:将某条路径上的边权取反. 操作三:询问某条路径上的最大权值. 解题 ...

  7. bzoj4034 (树链剖分+线段树)

    Problem T2 (bzoj4034 HAOI2015) 题目大意 给定一颗树,1为根节点,要求支持三种操作. 操作 1 :把某个节点 x 的点权增加 a . 操作 2 :把某个节点 x 为根的子 ...

  8. HDU4897 (树链剖分+线段树)

    Problem Little Devil I (HDU4897) 题目大意 给定一棵树,每条边的颜色为黑或白,起始时均为白. 支持3种操作: 操作1:将a->b的路径中的所有边的颜色翻转. 操作 ...

  9. Aizu 2450 Do use segment tree 树链剖分+线段树

    Do use segment tree Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.bnuoj.com/v3/problem_show ...

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

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

随机推荐

  1. IO流----File,递归,字节流,字符流

    要把数据持久化存储,就需要把内存中的数据存储到内存以外的其他持久化设备(硬盘.光盘.U盘等)上. 当需要把内存中的数据存储到持久化设备上这个动作称为输出(写)Output操作. 当把持久设备上的数据读 ...

  2. 9、调整数组顺序使奇数位于偶数前面------------>剑指offer系列

    题目描述 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变. 思路 首先寻找第一个 ...

  3. Godaddy虚拟主机新建mysql数据库 2019最新

    第一次用狗爹,完全摸不着路子. 网站本地已搭建,不知道数据库是在哪里上传. 百度搜索结果都是四五年前的旧内容,耽误时间. 还是问客服,Godaddy的客服确实不赖 godaddy虚拟主机如何新建数据库 ...

  4. wordpress安装后首页无法进入 The file 'wp-config.php' already exists

    问题是缓存导致,具体还没研究是怎么产生的缓存.chrome浏览器解决方法: 1. 网址后面加参数进入网站 2. 打开控制台-network 3. 刷新页面 4. 控制台-network,右键请求的文件 ...

  5. i-nex安装教程

    sudo add-apt-repository ppa:i-nex-development-team/stable sudo apt-get updatesudo apt-get i-nex

  6. SQL Server 2012安装配置(Part4 )

    SQL Server 2012安装配置(Part1) SQL Server 2012安装配置(Part2) SQL Server 2012安装配置(Part3 ) SQL Server 2012安装配 ...

  7. Windows计算机重置TCP / IP

    传输控制协议 (TCP / IP)是Internet上使用的通信协议. 在Windows的早期版本中,TCP / IP是一个单独的可选组件,可以像其他任何协议一样删除或添加. 早期版本中,从Windo ...

  8. Python3中requests库学习01(常见请求示例)

    1.请求携带参数的方式1.带数据的post data=字典对象2.带header的post headers=字典对象3.带json的post json=json对象4.带参数的post params= ...

  9. AutoIt上传非input控件方式的文件脚本

    AutoIt目前最新是v3版本,这是一个使用类似BASIC脚本语言的免费软件,它设计用于Windows GUI(图形用户界面)中进行自动化操作.它利用模拟键盘按键,鼠标移动和窗口/控件的组合来实现自动 ...

  10. 转载《五大免费采集器哪个好,火车头,海纳,ET,三人行,狂人采集 》

    在目前的站长圈内,比较流行的采集工具有很多,但是总结起来,比较出名的免费的就这么几个:火车头,海纳,ET,三人行,狂人. 下面我们对这几款采集工具作一个简单的评比. 1.火车头 基本上人人都知道,那就 ...