HDU 3966 - Aragorn's Story(树链剖分)
来源:互联网 发布:演讲书籍推荐知乎 编辑:程序博客网 时间:2024/05/21 10:06
题目:
http://acm.hdu.edu.cn/showproblem.php?pid=3966
题意:
n个点的树,每个点都有权值。q个询问:
Q u : 输出u点的权值。I u v d:将u到v的路径上点的权值增加d。D u v d:将u到v的路径上的点的权值减少d。
思路:
树链剖分。修改点权。
相关论文:http://blog.sina.com.cn/s/blog_7a1746820100wp67.html
AC.
#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>using namespace std;const int maxn = 5e4+4;int n, m;int val[maxn];int deep[maxn], fa[maxn], top[maxn], num[maxn], son[maxn], p[maxn], fp[maxn];int pos;int tot, head[maxn];struct Edge{ int to, next;}edge[maxn*2];void init(){ tot = 0; memset(head, -1, sizeof(head)); pos = 1; memset(son, -1, sizeof(son));}void addedge(int u, int v){ edge[tot].to = v; edge[tot].next = head[u]; head[u] = tot++;}int c[maxn];void add(int x, int v){ while(x <= n) { c[x] += v; x += x&-x; }}int sum(int x){ int s = 0; while(x > 0) { s += c[x]; x -= x&-x; } return s;}void dfs1(int u, int pre, int d){ deep[u] = d; fa[u] = pre; num[u] = 1; for(int i = head[u]; ~i; i = edge[i].next) { int v = edge[i].to; if(v == pre) continue; dfs1(v, u, d+1); num[u] += num[v]; if(son[u] == -1 || num[v] > num[son[u]]) { son[u] = v; } }}void getpos(int u, int sp){ top[u] = sp; p[u] = pos++; fp[p[u]] = u; if(son[u] == -1) return; getpos(son[u], sp); for(int i = head[u]; ~i; i = edge[i].next) { int v = edge[i].to; if(v != son[u] && v != fa[u]) { getpos(v, v); } }}void change(int u, int v, int val){ int f1 = top[u], f2 = top[v]; int tmp = 0; while(f1 != f2) { if(deep[f1] < deep[f2]) { swap(f1, f2); swap(u, v); } add(p[f1], val); add(p[u]+1, -val); u = fa[f1]; f1 = top[u]; } if(deep[u] > deep[v]) swap(u, v); add(p[u], val); add(p[v]+1, -val);}int main(){ // freopen("in", "r", stdin); int q; while(~scanf("%d%d%d", &n, &m, &q)) { for(int i = 1; i <= n; ++i) { scanf("%d", &val[i]); } init(); for(int i = 0; i < m; ++i) { int u, v; scanf("%d%d", &u, &v); addedge(u, v); addedge(v, u); } dfs1(1, 0, 0); getpos(1, 1); memset(c, 0, sizeof(c)); for(int i = 1; i <= n; ++i) { add(p[i], val[i]); add(p[i]+1, -val[i]); } char op[3]; int u, v, d; while(q--) { scanf("%s", op); if(op[0] == 'Q') { scanf("%d", &u); int uu = p[u]; printf("%d\n", sum(uu)); } else { scanf("%d%d%d", &u, &v, &d); if(op[0] == 'D') d = -d; change(u, v, d); } } } return 0;}
0 0
- HDU 3966 Aragorn's Story 树链剖分模板
- hdu 3966 Aragorn's Story(树链剖分)
- hdu 3966 Aragorn's Story (树链剖分)
- hdu 3966 Aragorn's Story 树链剖分
- Hdu 3966 Aragorn's Story (树链剖分)
- 【HDU】3966 Aragorn's Story 树链剖分
- HDU 3966 Aragorn's Story 树链剖分
- HDU 3966 Aragorn's Story(树链剖分)
- hdu 3966 Aragorn's Story 树链剖分
- HDU 3966 Aragorn's Story --树链剖分
- HDU 3966 Aragorn's Story (树链剖分)
- HDU 3966 Aragorn's Story(树链剖分)
- [HDU 3966] Aragorn's Story 树链剖分
- HDU 3966 Aragorn's Story(树链剖分)
- HDU 3966 Aragorn's Story 树链剖分
- HDU 3966 Aragorn's Story(树链剖分)
- HDU 3966 Aragorn's Story(树链剖分)
- HDU 3966 - Aragorn's Story(树链剖分)
- 多叉树的查找(广度优先遍历)
- 实现接口Runnab创建多线程
- 《Java编程思想》读书笔记3.操作符
- CygWin遇到WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED解决方法
- 0922第三方应用百度+友盟
- HDU 3966 - Aragorn's Story(树链剖分)
- 往NSMuArray和NSMutableDictionary填充数据
- 基于Kaggle数据的词袋模型文本分类教程
- MRC
- 两种线程创建的比较
- 设置NavigationBar标题的颜色
- 学习计划
- Android 4.4 中 WebView 使用注意事项
- POJ3984