HDU5692(线段树+dfs序)
Snacks
Description
由于零食被频繁的消耗和补充,零食机的价值v会时常发生变化。小度熊只能从编号为0的零食机出发,并且每个零食机至多经过一次。另外,小度熊会对某个零食机的零食有所偏爱,要求路线上必须有那个零食机。
为小度熊规划一个路线,使得路线上的价值总和最大。
Input
对于每组数据,包含两个整数n,m(1≤n,m≤100000),表示有n个零食机,m次操作。
接下来n−1行,每行两个整数x和y(0≤x,y<n),表示编号为x的零食机与编号为y的零食机相连。
接下来一行由n个数组成,表示从编号为0到编号为n−1的零食机的初始价值v(|v|<100000)。
接下来m行,有两种操作:0 x y,表示编号为x的零食机的价值变为y;1 x,表示询问从编号为0的零食机出发,必须经过编号为x零食机的路线中,价值总和的最大值。
本题可能栈溢出,辛苦同学们提交语言选择c++,并在代码的第一行加上:
`#pragma comment(linker, "/STACK:1024000000,1024000000") `
Output
对于每次询问,输出从编号为0的零食机出发,必须经过编号为x零食机的路线中,价值总和的最大值。
Sample Input
1 6 5 0 1 1 2 0 3 3 4 5 3 7 -5 100 20 -5 -7 1 1 1 3 0 2 -1 1 1 1 5
Sample Output
Case #1: 102 27 2 20 线段树+dfs序
1 //2016.8.11 2 #pragma comment(linker, "/STACK:1024000000, 1024000000") 3 #include<iostream> 4 #include<cstdio> 5 #include<vector> 6 #include<algorithm> 7 #define N 100005 8 #define lson (id<<1) 9 #define rson ((id<<1)|1) 10 #define mid ((l+r)>>1) 11 12 using namespace std; 13 14 struct node 15 { 16 long long max, lazy; 17 }tree[N*5]; 18 19 vector<int> v[N]; 20 long long w[N], val[N];//val[i]表示从根节点走到i节点的价值和 21 int in[N], out[N], flag;//in记录查询区间的左端,out记录查询区间的右端 22 23 24 //线段树模板 25 //************************************************************************************ 26 void push_up(int id) 27 { 28 tree[id].max = max(tree[lson].max, tree[rson].max); 29 return; 30 } 31 32 void build_tree(int id, int l, int r) 33 { 34 if(l == r) 35 { 36 tree[id].max = val[l]; 37 tree[id].lazy = 0; 38 return ; 39 } 40 build_tree(lson, l, mid); 41 build_tree(rson, mid+1, r); 42 push_up(id); 43 tree[id].lazy = 0; 44 return ; 45 } 46 47 void push_down(int id, int l, int r) 48 { 49 if(tree[id].lazy) 50 { 51 tree[lson].lazy += tree[id].lazy; 52 tree[rson].lazy += tree[id].lazy; 53 tree[lson].max += tree[id].lazy; 54 tree[rson].max += tree[id].lazy; 55 tree[id].lazy = 0; 56 } 57 return ; 58 } 59 60 void ins(int id, int l, int r, int ql, int qr, int tt) 61 { 62 if(ql<=l&&r<=qr) 63 { 64 tree[id].max += tt; 65 tree[id].lazy += tt; 66 return; 67 } 68 if(tree[id].lazy) push_down(id, l, r); 69 if(ql<=mid) 70 ins(lson, l, mid, ql, qr, tt); 71 if(mid+1<=qr) 72 ins(rson, mid+1, r, ql, qr, tt); 73 push_up(id); 74 return; 75 } 76 77 long long query(int id, int l, int r, int ql, int qr) 78 { 79 if(ql<=l && r<=qr) 80 { 81 return tree[id].max; 82 } 83 if(tree[id].lazy) 84 push_down(id, l, r); 85 long long maxnum = -9999999999999; 86 if(ql<=mid) maxnum = max(maxnum, query(lson, l, mid, ql, qr)); 87 if(mid+1<=qr) maxnum = max(maxnum, query(rson, mid+1, r, ql, qr)); 88 return maxnum; 89 } 90 //************************************************************************************ 91 92 void dfs(int a, int fa, long long wight) 93 { 94 in[a] = ++flag; 95 for(int i = 0; i < v[a].size(); i++) 96 { 97 int b = v[a][i]; 98 if(b==fa)continue; 99 dfs(b, a, w[b]+wight); 100 } 101 out[a] = flag; 102 val[in[a]] = wight; 103 } 104 105 int main() 106 { 107 int T, n, m, a, b, cmd; 108 cin>>T; 109 for(int kase = 1; kase <= T; kase++) 110 { 111 printf("Case #%d:\n", kase); 112 cin>>n>>m; 113 for(int i = 0; i < N; i++) 114 v[i].clear(); 115 for(int i = 0; i < n-1; i++) 116 { 117 scanf("%d%d", &a, &b); 118 a++; b++; 119 v[a].push_back(b); 120 v[b].push_back(a); 121 } 122 for(int i = 1 ; i <= n; i++) 123 scanf("%lld", &w[i]); 124 flag = 0; 125 dfs(1, 0, w[1]); 126 for(int i = 1; i <= n; i++) 127 cout<<in[i]<<" "<<out[i]<<endl; 128 build_tree(1, 1, n); 129 while(m--) 130 { 131 scanf("%d", &cmd); 132 if(cmd == 0) 133 { 134 scanf("%d%d", &a, &b);a++; 135 ins(1, 1, n, in[a], out[a], b-w[a]); 136 w[a] = b; 137 }else 138 { 139 scanf("%d", &a); a++; 140 long long ans = query(1, 1, n, in[a], out[a]); 141 cout<<ans<<endl; 142 } 143 } 144 } 145 146 return 0; 147 }
转载于:https://www.cnblogs.com/Penn000/p/5763114.html
HDU5692(线段树+dfs序)相关推荐
- bzoj3252攻略(线段树+dfs序)或者(树链剖分+dfs)
3252: 攻略 Time Limit: 10 Sec Memory Limit: 128 MB Submit: 1341 Solved: 642 [Submit][Status][Discuss] ...
- BZOJ_3252_攻略_线段树+dfs序
BZOJ_3252_攻略_线段树+dfs序 Description 题目简述:树版[k取方格数] 众所周知,桂木桂马是攻略之神,开启攻略之神模式后,他可以同时攻略k部游戏.今天他得到了一款新游戏< ...
- CodeForces - 620E New Year Tree(线段树+dfs序+状态压缩)
题目链接:点击查看 题目大意:给出一棵无向树,每个节点都有一种颜色,接下来时m次操作: 1 x y:将x及其子树染成y的颜色 2 x:查询x及其子树上共有多少种不同的颜色 题目分析:看完这个题的第一反 ...
- bzoj3252攻略(线段树+dfs序)
3252: 攻略 Time Limit: 10 Sec Memory Limit: 128 MB Submit: 562 Solved: 238 [Submit][Status][Discuss] ...
- HDU - 3974 Assign the task (线段树 + dfs序)
HDU - 3974 题意:有个公司有一些关系,每个人(除了boss)都有且仅有一个上司,这就是一棵树的关系,然后会有一些操作,C i,询问第i个人现在的任务,T x y,把y任务给x, 给x相当于给 ...
- 苹果树(线段树+Dfs序)
1228 苹果树 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description 在卡卡的房子外面,有一棵苹果树.每年的春天,树上总会结 ...
- Change FZU - 2277(线段树+dfs序)
There is a rooted tree with n nodes, number from 1-n. Root's number is 1.Each node has a value ai. I ...
- Codeforces 877 E Danil and a Part-time Job(线段树+dfs序)
题目地址 题意:给你一棵树,1为根节点,每个节点都有应该状态0或者1,你有两种操作,pow的操作是把该节点以及他的所有子树的每个节点进行自身异或的操作,get就是查询该节点以及他的所有子树的每个节点有 ...
- BZOJ 3779 LCT 线段树 DFS序 坑
hhhh抄了半天lty代码最后T了 对拍也没事.. 药丸 mine #pragma GCC optimize("O3") //By SiriusRen #include < ...
最新文章
- R语言text函数在R原生可视化结果中添加文本标签、内容:指定文本显示的位置、颜色、字体大小等(Position、Change Color 、 Size of Text)
- 计算机争夺战作文,电脑争夺战作文600字
- Qt Creator和VS2010中添加槽信号_差异与详解
- Java链表—— LinkedList
- C#求空间两点之间的距离
- idea for mac 控制台 mvn command not found
- 两个小程序大概的了解一下java的线程
- 微课|中学生可以这样学Python(例5.6、例5.7):集合应用
- 继腾讯、阿里、字节、快手等后,京东、有赞又爆大裁员,个别部门比例或达40%!...
- 【官宣】亚马逊云科技Build On 2022年技能提升计划正式启航
- 网络编程之bind()的未解之谜
- php Hash Table(二) Hash函数
- 联想 缺少计算机所需的介质驱动程序,联想笔记本缺少驱动应该怎么办
- win7下ApmServ启动失败问题
- 详细讲解修改allure报告自定义的logo和名称中文
- oracle spatial特点,Oracle Spatial中SDO_Geometry详细说明
- 易企秀资深前端架构师袁飞分享:移动H5开发如何避坑?
- STM32Cube工具学习笔记(一)Cube配置
- for循环的学习心得
- 专心致志求精进——给自己的生日祝福