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序
 //2016.8.11
#pragma comment(linker, "/STACK:1024000000, 1024000000")
#include<iostream>
#include<cstdio>
#include<vector>
#include<algorithm>
#define N 100005
#define lson (id<<1)
#define rson ((id<<1)|1)
#define mid ((l+r)>>1) using namespace std; struct node
{
long long max, lazy;
}tree[N*]; vector<int> v[N];
long long w[N], val[N];//val[i]表示从根节点走到i节点的价值和
int in[N], out[N], flag;//in记录查询区间的左端,out记录查询区间的右端 //线段树模板
//************************************************************************************
void push_up(int id)
{
tree[id].max = max(tree[lson].max, tree[rson].max);
return;
} void build_tree(int id, int l, int r)
{
if(l == r)
{
tree[id].max = val[l];
tree[id].lazy = ;
return ;
}
build_tree(lson, l, mid);
build_tree(rson, mid+, r);
push_up(id);
tree[id].lazy = ;
return ;
} void push_down(int id, int l, int r)
{
if(tree[id].lazy)
{
tree[lson].lazy += tree[id].lazy;
tree[rson].lazy += tree[id].lazy;
tree[lson].max += tree[id].lazy;
tree[rson].max += tree[id].lazy;
tree[id].lazy = ;
}
return ;
} void ins(int id, int l, int r, int ql, int qr, int tt)
{
if(ql<=l&&r<=qr)
{
tree[id].max += tt;
tree[id].lazy += tt;
return;
}
if(tree[id].lazy) push_down(id, l, r);
if(ql<=mid)
ins(lson, l, mid, ql, qr, tt);
if(mid+<=qr)
ins(rson, mid+, r, ql, qr, tt);
push_up(id);
return;
} long long query(int id, int l, int r, int ql, int qr)
{
if(ql<=l && r<=qr)
{
return tree[id].max;
}
if(tree[id].lazy)
push_down(id, l, r);
long long maxnum = -;
if(ql<=mid) maxnum = max(maxnum, query(lson, l, mid, ql, qr));
if(mid+<=qr) maxnum = max(maxnum, query(rson, mid+, r, ql, qr));
return maxnum;
}
//************************************************************************************ void dfs(int a, int fa, long long wight)
{
in[a] = ++flag;
for(int i = ; i < v[a].size(); i++)
{
int b = v[a][i];
if(b==fa)continue;
dfs(b, a, w[b]+wight);
}
out[a] = flag;
val[in[a]] = wight;
} int main()
{
int T, n, m, a, b, cmd;
cin>>T;
for(int kase = ; kase <= T; kase++)
{
printf("Case #%d:\n", kase);
cin>>n>>m;
for(int i = ; i < N; i++)
v[i].clear();
for(int i = ; i < n-; i++)
{
scanf("%d%d", &a, &b);
a++; b++;
v[a].push_back(b);
v[b].push_back(a);
}
for(int i = ; i <= n; i++)
scanf("%lld", &w[i]);
flag = ;
dfs(, , w[]);
for(int i = ; i <= n; i++)
cout<<in[i]<<" "<<out[i]<<endl;
build_tree(, , n);
while(m--)
{
scanf("%d", &cmd);
if(cmd == )
{
scanf("%d%d", &a, &b);a++;
ins(, , n, in[a], out[a], b-w[a]);
w[a] = b;
}else
{
scanf("%d", &a); a++;
long long ans = query(, , n, in[a], out[a]);
cout<<ans<<endl;
}
}
} return ;
}

HDU5692(线段树+dfs序)的更多相关文章

  1. Tsinsen A1505. 树(张闻涛) 倍增LCA,可持久化线段树,DFS序

    题目:http://www.tsinsen.com/A1505 A1505. 树(张闻涛) 时间限制:1.0s   内存限制:512.0MB    总提交次数:196   AC次数:65   平均分: ...

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

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

  3. 【XSY2534】【BZOJ4817】树点涂色 LCT 倍增 线段树 dfs序

    题目大意 ​ Bob有一棵\(n\)个点的有根树,其中\(1\)号点是根节点.Bob在每个点上涂了颜色,并且每个点上的颜色不同.定义一条路径的权值是:这条路径上的点(包括起点和终点)共有多少种不同的颜 ...

  4. 【bzoj4817】树点涂色 LCT+线段树+dfs序

    Description Bob有一棵n个点的有根树,其中1号点是根节点.Bob在每个点上涂了颜色,并且每个点上的颜色不同.定义一条路 径的权值是:这条路径上的点(包括起点和终点)共有多少种不同的颜色. ...

  5. S - Query on a tree HDU - 3804 线段树+dfs序

    S - Query on a tree HDU - 3804   离散化+权值线段树 题目大意:给你一棵树,让你求这棵树上询问的点到根节点直接最大小于等于val的长度. 这个题目和之前写的那个给你一棵 ...

  6. HDU 5692 线段树+dfs序

    Snacks Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Sub ...

  7. 【BZOJ-3779】重组病毒 LinkCutTree + 线段树 + DFS序

    3779: 重组病毒 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 224  Solved: 95[Submit][Status][Discuss] ...

  8. 【BZOJ-3306】树 线段树 + DFS序

    3306: 树 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 792  Solved: 262[Submit][Status][Discuss] De ...

  9. Codeforces 343D WaterTree - 线段树, DFS序

    Description Translated by @Nishikino_Maki from Luogu 行吧是我翻的 Mad scientist Mike has constructed a roo ...

随机推荐

  1. flexpaper二次开发

    1.首先下载FlexPaper的源码.下载地址 2.本人不懂flash,只是百度下,然后自己瞎弄弄的.我用的flash build 4.5 提供个key:1499-4181-9296-6452-299 ...

  2. HDU 1589 Find The Most Comfortable Road 最小生成树+枚举

    find the most comfortable road Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K ...

  3. head和tail命令-----得到头尾N行或者这去掉尾头N/N-1行

    [algo@localhost tmp]$ cat test  1 2 3 4 5 head得到头部2行,删掉尾部2行 [algo@localhost tmp]$ head -n +2 test  1 ...

  4. POJ 1584 A Round Peg in a Ground Hole

    先判断是不是N多边形,求一下凸包,如果所有点都用上了,那么就是凸多边形 判断圆是否在多边形内, 先排除圆心在多边形外的情况 剩下的情况可以利用圆心到每条边的最短距离与半径的大小来判断 #include ...

  5. Bootstrap学习指南

    一.Bootstrap简介 二.Bootstrap安装 三.Bootstrap CSS 四.Bootstrap 布局组件 五.Bootstrap 插件 六.Bootstrap定制

  6. 结对编程--Goldpoint Game

    黄金点游戏 黄金点游戏描述: N个同学(N通常大于10),每人写一个0~100之间的有理数 (不包括0或100),交给裁判,裁判算出所有数字的平均值,然后乘以0.618(所谓黄金分割常数),得到G值. ...

  7. Keil MDK下如何设置非零初始化变量(转)

    源:Keil MDK下如何设置非零初始化变量 一些工控产品,当系统复位后(非上电复位),可能要求保持住复位前RAM中的数据,用来快速恢复现场,或者不至于因瞬间复位而重启现场设备.而keil mdk在默 ...

  8. MySQL 同步状态

    Exec_Master_Log_Pos: The position of the last event executed by the SQL thread from the master's bin ...

  9. python mysql 2014 Commands out of sync; you can't run this command now

    这个问题出现再 mysql和c  的api. 简单的解决方法是不使用api直接把整个连接和命令传过去. 例如,cmd = 'mysql -h 192.168.32.210 -P 3316 -u bfd ...

  10. 第一章 Slenium2-Java 自动化测试基础

    都是一些最基础的知识点. 一:软件测试分类 1)单元测试:单元测试(或模块测试)是对程序中的单个子程序或具有独立功能的代码段进行测试的过程.2)集成测试:集成测试是在单元测试的基础上,先通过单元模块组 ...