hdu 3966 Aragorn's Story(树链剖分)
来源:互联网 发布:网络维护培训资料 编辑:程序博客网 时间:2024/06/05 06:12
kuangbin大佬模板里的,点权的模板。。。
#include <bits/stdc++.h>using namespace std;const int MAXN = 50010;struct Edge{ int to,next;} edge[MAXN*2];int head[MAXN],tot;int top[MAXN];int fa[MAXN];int dep[MAXN];int num[MAXN];int p[MAXN];int son[MAXN];int pos,n,c[MAXN];int a[MAXN];void init(){ tot = 0; memset(head,-1,sizeof(head)); pos = 1;//使用树状数组,编号从头1开始 memset(son,-1,sizeof(son));}void addedge(int u,int v){ edge[tot].to = v; edge[tot].next = head[u]; head[u] = tot++;}void dfs1(int u, int pre, int d){ dep[u] = d; fa[u] = pre; num[u] = 1; for(int i = head[u]; i != -1; 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++; if(son[u] == -1) return; getpos(son[u],sp); for(int i = head[u]; i != -1; i = edge[i].next) { int v = edge[i].to; if(v != son[u] && v != fa[u]) getpos(v,v); }}int lowbit(int x){ return x&(-x);}int sum(int i){ int s = 0; while(i > 0) { s += c[i]; i -= lowbit(i); } return s;}void add(int i, int val){ while(i <= n) { c[i] += val; i += lowbit(i); }}void Change(int u, int v, int val){ int f1 = top[u]; int f2 = top[v]; while(f1 != f2) { if(dep[f1] < dep[f2]) { swap(f1,f2); swap(u,v); } add(p[f1],val); add(p[u]+1,-val); u = fa[f1]; f1 = top[u]; } if(dep[u] > dep[v]) swap(u,v); add(p[u],val); add(p[v]+1,-val);}int main(){ int M,P; while(scanf("%d %d %d",&n,&M,&P) != EOF) { int u,v; int C1,C2,K; char op[10]; init(); for(int i = 1; i <= n; ++i) scanf("%d",&a[i]); while(M--) { 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],a[i]); add(p[i]+1,-a[i]); } while(P--) { scanf(" %s",op); if(op[0] == 'Q') { scanf("%d",&u); printf("%d\n",sum(p[u])); } else { scanf("%d %d %d",&C1,&C2,&K); if(op[0] == 'D') K = -K; Change(C1,C2,K); } } } 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 (树链剖分)
- iOS 多任务下载(支持离线
- HDU4452 Running Rabbits(模拟)
- Map集合遍历
- 请写出 float x 与“零值”比较的 if 语句(面试题)
- 中国科学院微生物研究所——人类肠道微生物2016年文章精选
- hdu 3966 Aragorn's Story(树链剖分)
- 数据结构第二周项目-C++参数传递的三种方式
- 【Android系列】View的绘制之measure过程
- DDL-操作数据库
- 我的gulp的初次尝试
- HTTP Status 405
- pat乙级1010题笔记
- 探究O(n^2)和O(nlogn)时间复杂度下各排序算法应用场景(一)
- Linux Socket 过程详细解释(三次建立握手,四次断开连接)