2014-10-05 16:30:43

思路:权在点上的线段树,加上树链剖分即可。注意这题容易RE爆栈,要手动扩栈!

  1 /*************************************************************************
  2     > File Name: 3966.cpp
  3     > Author: Nature
  4     > Mail: 564374850@qq.com
  5     > Created Time: Sun 05 Oct 2014 01:20:20 PM CST
  6 ************************************************************************/
  7 #pragma comment(linker,"/STACK:1024000000,1024000000")
  8 #include <cstdio>
  9 #include <cstring>
 10 #include <cstdlib>
 11 #include <iostream>
 12 #include <algorithm>
 13 using namespace std;
 14 #define lp (p << 1)
 15 #define rp (p << 1|1)
 16 #define getmid(l,r) (l + (r - l) / 2)
 17 const int maxn = 50010;
 18
 19 int N,M,P;
 20 int A[maxn];
 21 int first[maxn],next[maxn << 1],ver[maxn << 1],ecnt;
 22 int dep[maxn],sz[maxn],son[maxn],fa[maxn],top[maxn],w[maxn],aw[maxn],tsz;
 23
 24 struct node{
 25     int add;
 26     int val;
 27 }t[maxn << 2];
 28
 29 void Add_edge(int u,int v){
 30     next[++ecnt] = first[u];
 31     ver[ecnt] = v;
 32     first[u] = ecnt;
 33 }
 34
 35 void Dfs(int p,int pre,int d){
 36     sz[p] = 1;
 37     dep[p] = d;
 38     fa[p] = pre;
 39     son[p] = -1;
 40     int v,tmp = 0;
 41     for(int i = first[p]; i != -1; i = next[i]) if((v = ver[i]) != pre){
 42         Dfs(v,p,d + 1);
 43         if(sz[v] > tmp){
 44             son[p] = v;
 45             tmp = sz[v];
 46         }
 47         sz[p] += sz[v];
 48     }
 49 }
 50
 51 void Dfs_pos(int p,int tp){
 52     w[p] = ++tsz;
 53     aw[tsz] = p;
 54     top[p] = tp;
 55     if(son[p] != -1) Dfs_pos(son[p],tp);
 56     for(int i = first[p]; i != -1; i = next[i]){
 57         int v = ver[i];
 58         if(v != son[p] && v != fa[p])
 59             Dfs_pos(v,v);
 60     }
 61 }
 62
 63 void Build_tree(int p,int l,int r){
 64     t[p].add = 0;
 65     if(l == r){
 66         t[p].val = A[aw[l]];
 67         return;
 68     }
 69     int mid = getmid(l,r);
 70     Build_tree(lp,l,mid);
 71     Build_tree(rp,mid + 1,r);
 72 }
 73
 74 void Update_tree(int a,int b,int c,int p,int l,int r){
 75     if(a <= l && r <= b){
 76         t[p].add += c;
 77         return;
 78     }
 79     int mid = getmid(l,r);
 80     if(a <= mid) Update_tree(a,b,c,lp,l,mid);
 81     if(b > mid) Update_tree(a,b,c,rp,mid + 1,r);
 82 }
 83
 84 int Query_tree(int a,int p,int l,int r,int plu){
 85     if(l == r)
 86         return t[p].val + t[p].add + plu;
 87     int mid = getmid(l,r);
 88     if(a <= mid) return Query_tree(a,lp,l,mid,plu + t[p].add);
 89     else return Query_tree(a,rp,mid + 1,r,plu + t[p].add);
 90 }
 91
 92 void Change(int a,int b,int c){
 93     int f1 = top[a],f2 = top[b];
 94     while(f1 != f2){
 95         if(dep[f1] > dep[f2]){
 96             swap(a,b);
 97             swap(f1,f2);
 98         }
 99         Update_tree(w[f2],w[b],c,1,1,tsz);
100         b = fa[f2];
101         f2 = top[b];
102     }
103     if(dep[a] > dep[b]) swap(a,b);
104     Update_tree(w[a],w[b],c,1,1,tsz);
105 }
106
107 void Init(){
108     memset(first,-1,sizeof(first));
109     ecnt = 0;
110     tsz = 0;
111 }
112
113 int main(){
114     char s[5];
115     int a,b,c;
116     while(scanf("%d%d%d",&N,&M,&P) != EOF){
117         Init();
118         for(int i = 1; i <= N; ++i)
119             scanf("%d",A + i);
120         for(int i = 1; i < N; ++i){
121             scanf("%d%d",&a,&b);
122             Add_edge(a,b);
123             Add_edge(b,a);
124         }
125         Dfs(1,0,0);
126         Dfs_pos(1,1);
127         Build_tree(1,1,tsz);
128         for(int i = 1; i <= P; ++i){
129             scanf("%s%d",s,&a);
130             if(s[0] == 'I' || s[0] == 'D'){
131                 scanf("%d%d",&b,&c);
132                 if(s[0] == 'D') Change(a,b,-c);
133                 else Change(a,b,c);
134             }
135             else printf("%d\n",Query_tree(w[a],1,1,tsz,0));
136         }
137     }
138     return 0;
139 }

转载于:https://www.cnblogs.com/naturepengchen/articles/4007125.html

Hdu--3966(树链剖分,线段树 or 树状数组)相关推荐

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

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

  2. HDU - 3804 Query on a tree(树链剖分+线段树+离线处理)

    题目链接:点击查看 题目大意:给出一棵树,每条边上都有一个权值,给出m个查询:a,b:问从点1到点a的唯一路径上,在边权小于等于b的边中选出边权最大的值输出,若没有符合条件的边则输出-1: 题目分析: ...

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

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

  4. BZOJ3862Little Devil I——树链剖分+线段树

    题目大意: 给一棵树,每条边可能是黑色或白色(起始都是白色),有三种操作: 1.将u到v路径上所有边颜色翻转(黑->白,白->黑) 2.将只有一个点在u到v路径上的边颜色翻转 3.查询u到 ...

  5. CodeForces - 160D Edges in MST(思维+tarjan/树链剖分+线段树)

    题目链接:点击查看 题目大意:给出一张 n 个点 m 条边组成的带权无向图,现在对于每条边来说,确定一下其分类: 一定是最小生成树上的边 可能是最小生成树上的边 一定不是最小生成树的边 题目分析:两种 ...

  6. CodeForces - 609E Minimum spanning tree for each edge(最小生成树+树链剖分+线段树/树上倍增)

    题目链接:点击查看 题目大意:给出一张 n 个点和 m 条边组成的无向图,现在询问包含每一条边的最小生成树 题目分析:考虑求解次小生成树的思路: 求出最小生成树 ans 枚举每一条非树边 ( u , ...

  7. SPOJ - QTREE Query on a tree(树链剖分+线段树)

    题目链接:点击查看 题目大意:给出一棵由n个点组成的树,再给出数个操作,每次操作分为下列几种类型: QUERY x y:询问点x-点y这条路径上的所有边权的最大值 CHANGE x y:将第x条边的权 ...

  8. P2486 [SDOI2011]染色(树链剖分+线段树)

    题干描述 输入描述 输出格式 对于每个询问操作,输出一行答案. 输入输出样例 输入 #1 复制 6 5 2 2 1 2 1 1 1 2 1 3 2 4 2 5 2 6 Q 3 5 C 2 1 1 Q ...

  9. YbtOJ-染色计划【树链剖分,线段树,tarjan】

    正题 题目大意 给出nnn个点的一棵树,每个点有个颜色aia_iai​,你每次可以选择一个颜色全部变成另一个颜色. 求最少多少次操作可以把一种颜色变成一个完整的连通块. 1≤k≤n≤2×1051\le ...

  10. BZOJ4127Abs——树链剖分+线段树

    题目描述 给定一棵树,设计数据结构支持以下操作 1 u v d 表示将路径 (u,v) 加d 2 u v 表示询问路径 (u,v) 上点权绝对值的和 输入 第一行两个整数n和m,表示结点个数和操作数 ...

最新文章

  1. docker 查看容器磁盘大小_软件安全 : Docker逃逸详解
  2. 输入一个正整数,求它各位数的数字之和
  3. 国际主流云厂商生存画像:三大赛道愈发清晰
  4. 用Python写一个将Python2代码转换成Python3代码的批处理工具
  5. 论HTML5 Audio 标签歌词同步的实现
  6. 3月30日见!荣耀30S外观“偷跑”:经典蝶羽纹理设计
  7. JAVA线程池_并发队列工作笔记0002---认识线程池_在线程池中使用队列
  8. 遍历点击事件(屏蔽同类名的其它点击事件,防止多次请求)
  9. JSP中使用JSP模板
  10. Guice集成Properties配置
  11. DES加密,前端示例,Java示例,在线测试
  12. 360全景倒车影像怎么看_360全景影像和倒车影像有什么区别
  13. 【转】常用单位换算表
  14. xcode 软件˙∆集~
  15. 重装Office后打开Powerpoint和excel提示找不到VCRUNTIME140_1.dll的解决办法(亲测成功,简单有效)
  16. 原生webgl学习(六) WebGL写简单的汉字(一)
  17. ios测试硬盘速度软件,MAC测试“读写速度达100MB/s_希捷 Backup Plus Slim for Mac 500GB_移动存储评测-中关村在线...
  18. 数据与计算机通信实验报告,完整版通信工程专业综合实验报告
  19. 按键精灵批量递增保存图片脚本
  20. 使用WebServiceStudio测试WebService接口

热门文章

  1. 第12届蓝桥杯 我的第一个比赛
  2. 自己写jquery表单验证
  3. 用QuickCHM v2.6 制作帮助文档
  4. 安卓系统加速_真就这么简单让你的安卓手机变流畅?
  5. 北京中国石油大学计算机考研分数线,中国石油大学(北京)2018年考研复试基本分数线...
  6. Linux下的图片转换工具ImageMagick
  7. 电磁波频谱 和 波段划分以及名称由来(收集)
  8. Taylor Swift - Enchanted_20131123141153-pdf
  9. 用python解决放苹果问题_放苹果
  10. win8页面 html,Win8 Metro风格界面设计HTML+CSS网页模板