Snacks

Time Limit:5000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u

Submit Status

Description

百度科技园内有n个零食机,零食机之间通过n−1条路相互连通。每个零食机都有一个值v,表示为小度熊提供零食的价值。

由于零食被频繁的消耗和补充,零食机的价值v会时常发生变化。小度熊只能从编号为0的零食机出发,并且每个零食机至多经过一次。另外,小度熊会对某个零食机的零食有所偏爱,要求路线上必须有那个零食机。

为小度熊规划一个路线,使得路线上的价值总和最大。

Input

输入数据第一行是一个整数T(T≤10),表示有T组测试数据。

对于每组数据,包含两个整数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

对于每组数据,首先输出一行”Case #?:”,在问号处应填入当前数据的组数,组数从1开始计算。

对于每次询问,输出从编号为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序)相关推荐

  1. bzoj3252攻略(线段树+dfs序)或者(树链剖分+dfs)

    3252: 攻略 Time Limit: 10 Sec Memory Limit: 128 MB Submit: 1341 Solved: 642 [Submit][Status][Discuss] ...

  2. BZOJ_3252_攻略_线段树+dfs序

    BZOJ_3252_攻略_线段树+dfs序 Description 题目简述:树版[k取方格数] 众所周知,桂木桂马是攻略之神,开启攻略之神模式后,他可以同时攻略k部游戏.今天他得到了一款新游戏< ...

  3. CodeForces - 620E New Year Tree(线段树+dfs序+状态压缩)

    题目链接:点击查看 题目大意:给出一棵无向树,每个节点都有一种颜色,接下来时m次操作: 1 x y:将x及其子树染成y的颜色 2 x:查询x及其子树上共有多少种不同的颜色 题目分析:看完这个题的第一反 ...

  4. bzoj3252攻略(线段树+dfs序)

    3252: 攻略 Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 562  Solved: 238 [Submit][Status][Discuss] ...

  5. HDU - 3974 Assign the task (线段树 + dfs序)

    HDU - 3974 题意:有个公司有一些关系,每个人(除了boss)都有且仅有一个上司,这就是一棵树的关系,然后会有一些操作,C i,询问第i个人现在的任务,T x y,把y任务给x, 给x相当于给 ...

  6. 苹果树(线段树+Dfs序)

    1228 苹果树  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond 题目描述 Description 在卡卡的房子外面,有一棵苹果树.每年的春天,树上总会结 ...

  7. 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 ...

  8. Codeforces 877 E Danil and a Part-time Job(线段树+dfs序)

    题目地址 题意:给你一棵树,1为根节点,每个节点都有应该状态0或者1,你有两种操作,pow的操作是把该节点以及他的所有子树的每个节点进行自身异或的操作,get就是查询该节点以及他的所有子树的每个节点有 ...

  9. BZOJ 3779 LCT 线段树 DFS序 坑

    hhhh抄了半天lty代码最后T了  对拍也没事.. 药丸 mine #pragma GCC optimize("O3") //By SiriusRen #include < ...

最新文章

  1. R语言text函数在R原生可视化结果中添加文本标签、内容:指定文本显示的位置、颜色、字体大小等(Position、Change Color 、 Size of Text)
  2. 计算机争夺战作文,电脑争夺战作文600字
  3. Qt Creator和VS2010中添加槽信号_差异与详解
  4. Java链表—— LinkedList
  5. C#求空间两点之间的距离
  6. idea for mac 控制台 mvn command not found
  7. 两个小程序大概的了解一下java的线程
  8. 微课|中学生可以这样学Python(例5.6、例5.7):集合应用
  9. 继腾讯、阿里、字节、快手等后,京东、有赞又爆大裁员,个别部门比例或达40%!...
  10. 【官宣】亚马逊云科技Build On 2022年技能提升计划正式启航
  11. 网络编程之bind()的未解之谜
  12. php Hash Table(二) Hash函数
  13. 联想 缺少计算机所需的介质驱动程序,联想笔记本缺少驱动应该怎么办
  14. win7下ApmServ启动失败问题
  15. 详细讲解修改allure报告自定义的logo和名称中文
  16. oracle spatial特点,Oracle Spatial中SDO_Geometry详细说明
  17. 易企秀资深前端架构师袁飞分享:移动H5开发如何避坑?
  18. STM32Cube工具学习笔记(一)Cube配置
  19. for循环的学习心得
  20. 专心致志求精进——给自己的生日祝福

热门文章

  1. [架构]--高并发问题及解决方案
  2. Spring学习(8)--- @Autowired注解(一)
  3. shell中(字符串截取)
  4. sniffer使用查网络故障
  5. SpringMVC源码阅读:过滤器
  6. Spring【依赖注入】就是这么简单
  7. shell脚本的exit问题(退出脚本还是退出终端)
  8. JS设置浏览器URL,任意定制,安全可靠
  9. validator API文档
  10. 《Doing It - Management 3.0 Experiences》作者访谈