Snacks

Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 4446    Accepted Submission(s): 980


Problem 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
 

Source
 

Recommend
wange2014   |   We have carefully selected several similar problems for you:  6275 6274 6273 6272 6271 


Well不太会写
贴几个博客链接吧
dfs序https://acm.sjtu.edu.cn/w/images/3/35/%E6%A0%91%E7%9A%84dfs%E5%BA%8F%E5%8F%8A%E5%85%B6%E5%BA%94%E7%94%A8%EF%BC%88%E9%97%AB%E9%B8%BF%E5%AE%87%EF%BC%89.pdf
线段树
http://www.cnblogs.com/TenosDoIt/p/3453089.html
lazy操作
https://blog.csdn.net/xs18952904/article/details/72763467
以及 题解
http://www.cnblogs.com/liyinggang/p/5925196.html

这是一条已经看懂的分割线                                                                                                                                                      

基本就是按照题解写的思路

先dfs遍历所有的路径 确定dfs序 这个序就是未来线段树的的基础

相当于线段树的先序遍历

用这些节点建立线段树 转换成了求区间最大值

RE 了一发是因为cnt忘记初始化了

WA了一发是因为inf定的0x3f3f3f3f太小了 改成1e18就过了

类型改成longlong的时候inf也要记得改过来

#pragma comment(linker, "/STACK:1024000000,1024000000")
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<algorithm>
#define inf 1e18
using namespace std; const int maxn = 100005;
int n, t, m;
struct node{
int v, next;
}edges[maxn << 2];
int head[maxn], tot, cnt;//tot为边的数量 cnt用于标记dfs序
int in[maxn] ,out[maxn];
long long lazy[maxn << 2];
long long dis[maxn], b[maxn];
long long sum[maxn << 2], cost[maxn]; void init()
{
memset(head, -1, sizeof(head));
tot = cnt = 0;
} void addedge(int u, int v, int &k)
{
edges[k].v = v;
edges[k].next = head[u];
head[u] = k++;
} void pushup(int idx)
{
sum[idx] = max(sum[idx<<1], sum[idx<<1|1]);
} void pushdown(int idx)
{
if(lazy[idx]){
sum[idx<<1] += lazy[idx];
sum[idx<<1|1] += lazy[idx];
lazy[idx<<1] += lazy[idx];
lazy[idx<<1|1] += lazy[idx];
lazy[idx] = 0;
}
return;
} void build(int l, int r, int root)
{
lazy[root] = 0;
if(l == r){
sum[root] = b[l];
return;
}
int mid = (l + r) >> 1;
build(l, mid, root << 1);
build(mid + 1, r, root << 1 | 1);
pushup(root);
} void update(int l, int r, int ll, int rr, int idx, int val)
{
//让l和r进入llrr的区间内
if(l >= ll && r <= rr){
sum[idx] = sum[idx] + val;//val为变化量
lazy[idx] = lazy[idx] + val;
return;
}
int mid = (l + r) >> 1;
pushdown(idx);
if(mid >= ll) update(l, mid, ll, rr, idx << 1, val);
if(mid < rr) update(mid + 1, r, ll, rr, idx << 1 | 1, val);
pushup(idx);
} long long mm = -1;
void query(int l, int r, int ll, int rr, int idx)
{
if(l >= ll && r <= rr){
mm = max(mm, sum[idx]);
return;
}
int mid = (l + r) >> 1;
pushdown(idx);
if(mid >= ll) query(l, mid, ll, rr, idx << 1);
if(mid < rr) query(mid + 1, r, ll, rr, idx << 1 | 1);
}
void dfs(int u, int pre)
{
//cnt标记dfs序
in[u] = ++cnt;
b[cnt] = dis[u];
for(int k = head[u]; k != -1; k = edges[k].next){
int v = edges[k].v;
if(v == pre) continue;
dis[v] = dis[u] + cost[v];
dfs(v, u);
}
out[u] = cnt;
} int main()
{
cin>>t;
for(int cas = 1; cas <= t; cas++){
init();
scanf("%d%d", &n, &m);
for(int i = 0; i < n - 1; i++){
int u, v;
scanf("%d%d", &u, &v);
addedge(u, v, tot);
addedge(v, u, tot);
}
for(int i = 0; i < n; i++){
scanf("%lld", &cost[i]);
}
dis[0] = cost[0];
dfs(0, -1);//dfs路径 dfs序
build(1, n, 1);
printf("Case #%d:\n", cas);
while(m--){
int op, x, y;
scanf("%d", &op);
if(op == 1){
scanf("%d", &x);
mm = -inf;
query(1, n, in[x], out[x], 1);
printf("%lld\n", mm);
}
else{
scanf("%d%d", &x, &y);
long long change = (long long)y - cost[x];
update(1, n, in[x], out[x], 1, change);
cost[x] = y;
}
}
}
return 0;
}

hdu5692【dfs序】【线段树】的更多相关文章

  1. hdu5692 dfs序线段树

    这是补的知识点,按先序遍历的顺序建立dfs序,用左右两个值代表整个区间,因为dfs序最重要的特点就是子树的区间是连续的 建立线段树时,需要用重新标过的 下标来建立 #pragma comment(li ...

  2. HDU5692(dfs序+线段树)

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

  3. Educational Codeforces Round 6 E dfs序+线段树

    题意:给出一颗有根树的构造和一开始每个点的颜色 有两种操作 1 : 给定点的子树群体涂色 2 : 求给定点的子树中有多少种颜色 比较容易想到dfs序+线段树去做 dfs序是很久以前看的bilibili ...

  4. 【BZOJ-3252】攻略 DFS序 + 线段树 + 贪心

    3252: 攻略 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 339  Solved: 130[Submit][Status][Discuss] D ...

  5. Codeforces 343D Water Tree(DFS序 + 线段树)

    题目大概说给一棵树,进行以下3个操作:把某结点为根的子树中各个结点值设为1.把某结点以及其各个祖先值设为0.询问某结点的值. 对于第一个操作就是经典的DFS序+线段树了.而对于第二个操作,考虑再维护一 ...

  6. BZOJ2434 [Noi2011]阿狸的打字机(AC自动机 + fail树 + DFS序 + 线段树)

    题目这么说的: 阿狸喜欢收藏各种稀奇古怪的东西,最近他淘到一台老式的打字机.打字机上只有28个按键,分别印有26个小写英文字母和'B'.'P'两个字母.经阿狸研究发现,这个打字机是这样工作的: 输入小 ...

  7. POJ 3321 DFS序+线段树

    单点修改树中某个节点,查询子树的性质.DFS序 子树序列一定在父节点的DFS序列之内,所以可以用线段树维护. 1: /* 2: DFS序 +线段树 3: */ 4:   5: #include < ...

  8. 【XSY2667】摧毁图状树 贪心 堆 DFS序 线段树

    题目大意 给你一棵有根树,有\(n\)个点.还有一个参数\(k\).你每次要删除一条长度为\(k\)(\(k\)个点)的祖先-后代链,问你最少几次删完.现在有\(q\)个询问,每次给你一个\(k\), ...

  9. F - Change FZU - 2277 (DFS序+线段树)

    题目链接: F - Change FZU - 2277 题目大意: 题意: 给定一棵根为1, n个结点的树. 有q个操作,有两种不同的操作 (1) 1 v k x : a[v] += x, a[v ' ...

  10. BZOJ4551[Tjoi2016&Heoi2016]树——dfs序+线段树/树链剖分+线段树

    题目描述 在2016年,佳媛姐姐刚刚学习了树,非常开心.现在他想解决这样一个问题:给定一颗有根树(根为1),有以下 两种操作:1. 标记操作:对某个结点打上标记(在最开始,只有结点1有标记,其他结点均 ...

随机推荐

  1. Dubbo -- 系统学习 笔记 -- 示例 -- 只订阅

    Dubbo -- 系统学习 笔记 -- 目录 示例 想完整的运行起来,请参见:快速启动,这里只列出各种场景的配置方式 只订阅 问题 为方便开发测试,经常会在线下共用一个所有服务可用的注册中心,这时,如 ...

  2. grid网格的流动grid-auto-flow属性

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  3. C语言中的static关键字

    C语言代码是以文件为单位来组织的,在一个源程序的所有源文件中,一个外部变量(注意不是局部变量)或者函数只能在一个源程序中定义一次,如果有重复定义的话编译器就会报错.伴随着不同源文件变量和函数之间的相互 ...

  4. osgEarth设置模型旋转角度

    #include<windows.h> #include <osgViewer/Viewer> #include <osgEarthDrivers/gdal/GDALOp ...

  5. 解决“Connection to https://dl-ssl.google.com refused”问题

    相信一些人刚开始搞android的安装开发环境的时候会遇到:Failed to fectch URl https://dl-ssl.google.com/android/repository/addo ...

  6. zabbix的启动和关闭脚本

    1. zabbix客户端的系统服务脚本 1.1 拷贝启动脚本 zabbix的源码提供了系统服务脚本,在/usr/local/src/zabbix-3.2.6/misc/init.d目录下,我的系统是C ...

  7. 说说C与汇编之间的互相联系(转)

    在嵌入式系统开发中,目前使用的主要编程语言是C和汇编,C++已经有相应的编译器,但是现在使用还是比较少的.在稍大规模的嵌入式软件中,例如含有OS,大部分的代码都是用C编写的,主要是因为C语言的结构比较 ...

  8. 关于VC中的附加进程调试

    今天领导要求在服务端添加一个获取会议参数的功能接口,接口写好后要自己测试,但是没有客户端的源码,只有客户端安装程序和客户端与服务端发送信令的底层库KSYSClient.dll,而我修改了客户端需要底层 ...

  9. 探求C#.Net中ArrayList与Array的区别

     ArrayList与Array的区别概述     ArrayList 是数组的复杂版本.ArrayList 类提供在大多数 Collections 类中提供但不在 Array 类中提供的一些功能.例 ...

  10. Web负载均衡与分布式架构

     参考帖子: Web负载均衡的几种实现方式 大型网站架构系列:负载均衡详解(上) DNS 原理入门 解决nginx负载均衡的session共享问题 什么是消息队列 Java应用架构的演化之路 Java ...