hdu 5692 Snacks(dfs时间戳+线段树)
Snacks
Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 2165 Accepted Submission(s): 513
由于零食被频繁的消耗和补充,零食机的价值v会时常发生变化。小度熊只能从编号为0的零食机出发,并且每个零食机至多经过一次。另外,小度熊会对某个零食机的零食有所偏爱,要求路线上必须有那个零食机。
为小度熊规划一个路线,使得路线上的价值总和最大。
对于每组数据,包含两个整数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") `
对于每次询问,输出从编号为0的零食机出发,必须经过编号为x零食机的路线中,价值总和的最大值。
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
102
27
2
20
#pragma comment(linker, "/STACK:1024000000,1024000000")
#include<cstdio>
#include<iostream>
#include<cstring>
#define clr(x) memset(x,0,sizeof(x))
#define clr_1(x) memset(x,-1,sizeof(x))
#define LL long long
#define INF (1e18)
using namespace std;
struct edg
{
int next,to;
}edge[<<];
struct seg
{
int l,r;
LL maxn,tag;
}segt[<<];
int head[],dfstm[],pre[],last[],n,m,k,u,v,s,T,cnt;
LL value[],sum[],x;
LL max(LL a, LL b)
{
return a>b?a:b;
}
void addedge(int u,int v)
{
edge[++cnt].to=v;
edge[cnt].next=head[u];
head[u]=cnt;
return ;
}
void dfs(int i,int fa)
{
sum[i]=sum[fa]+value[i];
dfstm[++k]=i;
pre[i]=k;
for(int j=head[i];j!=-;j=edge[j].next)
if(edge[j].to!=fa)
dfs(edge[j].to,i);
last[i]=k;
return ;
}
void init(int i,int l,int r)
{
segt[i]=(seg){l,r,,};
if(l==r)
{
segt[i].maxn=sum[dfstm[l]];
return;
}
int mid=(l+r)>>;
init(i<<,l,mid);
init(i<<|,mid+,r);
segt[i].maxn=max(segt[i<<].maxn,segt[i<<|].maxn);
return ;
}
void pushdown(int i)
{
if(segt[i].tag!=)
{
if(segt[i].l!=segt[i].r)
{
segt[i<<].maxn+=segt[i].tag;
segt[i<<|].maxn+=segt[i].tag;
segt[i<<].tag+=segt[i].tag;
segt[i<<|].tag+=segt[i].tag;
}
segt[i].tag=;
}
return ;
}
void update(int i,int l,int r,LL addval)
{
if(segt[i].l>=l && segt[i].r<=r)
{
segt[i].tag+=addval;
segt[i].maxn+=addval;
return ;
}
pushdown(i);
int mid=(segt[i].l+segt[i].r)>>;
if(mid>=r)
{
update(i<<,l,r,addval);
}
else if(mid<l)
{
update(i<<|,l,r,addval);
}
else
{
update(i<<,l,r,addval);
update(i<<|,l,r,addval);
}
segt[i].maxn=max(segt[i<<].maxn,segt[i<<|].maxn);
return ;
}
LL query(int i,int l,int r)
{
if(segt[i].l>=l && segt[i].r<=r)
{
return segt[i].maxn;
}
pushdown(i);
int mid=(segt[i].l+segt[i].r)>>;
LL ans=-INF;
if(mid>=r)
{
ans=max(ans,query(i<<,l,r));
}
else if(mid<l)
{
ans=max(ans,query(i<<|,l,r));
}
else
{
ans=max(ans,query(i<<,l,r));
ans=max(ans,query(i<<|,l,r));
}
segt[i].maxn=max(segt[i<<].maxn,segt[i<<|].maxn);
return ans;
}
int main()
{
scanf("%d",&T);
for(int kase=;kase<=T;kase++)
{
clr_1(head);
clr(sum);
cnt=;
k=;
printf("Case #%d:\n",kase);
scanf("%d%d",&n,&m);
for(int i=;i<n;i++)
{
scanf("%d%d",&u,&v);
addedge(u,v);
addedge(v,u);
}
for(int i=;i<n;i++)
{
scanf("%lld",&value[i]);
}
dfs(,);
init(,,n);
for(int i=;i<=m;i++)
{
scanf("%d",&k);
if(k)
{
scanf("%d",&u);
printf("%lld\n",query(,pre[u],last[u]));
}
else
{
scanf("%d%lld",&u,&x);
update(,pre[u],last[u],x-value[u]);
value[u]=x;
}
}
}
return ;
}
hdu 5692 Snacks(dfs时间戳+线段树)的更多相关文章
- HDU.5692 Snacks ( DFS序 线段树维护最大值 )
HDU.5692 Snacks ( DFS序 线段树维护最大值 ) 题意分析 给出一颗树,节点标号为0-n,每个节点有一定权值,并且规定0号为根节点.有两种操作:操作一为询问,给出一个节点x,求从0号 ...
- HDU 5692 Snacks(DFS序+线段树)
Snacks Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Sub ...
- hdu 3974 dfs时间戳+线段树
题意: 一个公司里面每个员工都有一个顶头上司,一旦给某个员工分配任务后,这个员工以及该员工的所有下属都在做该任务. 有若干操作,分配给员工任务以及查询该员工正在执行的任务. 题解: 典型的更新字树的操 ...
- hdu-5692 Snacks(dfs序+线段树)
题目链接: Snacks Problem Description 百度科技园内有n个零食机,零食机之间通过n−1条路相互连通.每个零食机都有一个值v,表示为小度熊提供零食的价值. 由于零食被频繁的 ...
- HDU5692 Snacks DFS序 线段树
去博客园看该题解 题目 HDU5692 Snacks Problem Description 百度科技园内有n个零食机,零食机之间通过n−1条路相互连通.每个零食机都有一个值v,表示为小度熊提供零食的 ...
- HDU3974 Assign the task —— dfs时间戳 + 线段树
题目链接:https://vjudge.net/problem/HDU-3974 There is a company that has N employees(numbered from 1 to ...
- HDU - 4366 Successor DFS区间+线段树
Successor:http://acm.hdu.edu.cn/showproblem.php?pid=4366 参考:https://blog.csdn.net/colin_27/article/d ...
- Assign the task HDU - 3974(dfs序+线段树)
There is a company that has N employees(numbered from 1 to N),every employee in the company has a im ...
- HDU 4366 Successor( DFS序+ 线段树 )
Successor Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total S ...
随机推荐
- Tomcat8利用Redis配置Session共享
同一个应用在运行多个tomcat实例的时候,经常需要共享Session.tomcat配置共享session有多种方式 1.利用tomcat自身集群特性进行配置: 2.利用Memcache第三方缓存进行 ...
- 【洛谷 P2754】 [CTSC1999]家园(最大流)
题目链接 突然发现Dinic很好写诶.. 第一次数组开小了,玄学\(WA\),what?数据范围描述有误? 分层图,每天为一层. 把上一天的每个空间站向这一天连一条流量为inf的边,表示可以原地不动. ...
- ie8下trim失效
1.ie8下使用trim失效 trim可以除去字符串两侧的空白字符,但ie8并不支持 2.解决方案 String.prototype.trim = function () { return this ...
- Spring Cloud与Spring Boot的关系
1.Spring Cloud是一个工具集:Spring Cloud是在Spring Boot的基础上构建的,用于简化分布式系统构建的工具集:使架构师在创建和发布微服务时极为便捷和有效. Sp ...
- OpenRCT2-ext
https://github.com/RollingStar/RCT-Music-Patch https://github.com/seanfisk/rct2-game-objects https:/ ...
- IE7下面iframe滚动条无法用鼠标轮滚 其他浏览器可以
1.让 IFRAME 隐藏滚动条,通常的做法就是在嵌入 IFRAME 的页面的 CSS 中指定以下规则: html, body {overflow: hidden} 2.如果只是想隐藏横向滚 ...
- dotnet core多平台开发体验(mac os x 、windows、linux)
前言 随着net core rc2的发布,园子里面关于net core的入门文章也也多了起来,但是大多数都是在一个平台上面来写几个简单的例子,或者是在解释代码本身,并没有体现说在一个平台上面创建一个项 ...
- http跟https的区别
http: Hypertext transform protocol 超文本传输协议 是一个为了传输超媒体文档(比如html)的应用层协议 是为了web的浏览器跟web的server端的交流而设计的, ...
- LeetCode解题报告—— Maximal Rectangle
Given a 2D binary matrix filled with 0's and 1's, find the largest rectangle containing only 1's and ...
- [转载]Python logging模块详解
原文地址: http://blog.csdn.net/zyz511919766/article/details/25136485 简单将日志打印到屏幕: import logging logging. ...