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 ...
随机推荐
- 如何用js自己实现Animate运动函数
js运动是我们学习js必不可少的研究部分,首先我们要知道js的运动其实仅仅是不断改变元素的某个属性值而已,比如不断改变一个绝对定位div的left值,那么你看到的效果就是这个div不断的向右边运动,那 ...
- perl 列出一个目录下的文件的大小
use strict; use warnings; use Cwd; my $dir = 'd:\\www'; chdir($dir); opendir DIR, $dir or die " ...
- 【EverydaySport】健身笔记——静态牵拉
静态牵拉一般在运动后进行,可以有效的提高肌肉的柔韧性和关节的灵活性,预防和缓解疼痛. 每个动作达到自己活动范围的最大,有牵拉感即说明有效,静态保持至少30秒,切勿震荡,进行2组. 1 大腿前群牵拉 2 ...
- C++之参数总结
函数的形参为函数提供了已命名的局部存储空间,它是在函数的形参表中定义的,并由调用函数时传递给函数的实参初始化,而形参的 初始化与变量的初始化一样,如果形参具有非引用类型,则复制实参的值,如果形参为引用 ...
- rdpClient
https://github.com/jean343/RPI-GPU-rdpClient https://github.com/Nullstr1ng/MultiRDPClient.NET https: ...
- 使用cURL POST上传文件
使用cURL POST上传文件 http://blog.csdn.net/v6543210/article/details/20152575
- 用pyperclip 模块拷贝粘贴字符串
>>> import pyperclip>>> pyperclip.copy('Hello world!')>>> pyperclip.paste ...
- C#通过反射获取类中的方法和参数个数,反射调用方法带参数
using System; using System.Reflection; namespace ConsoleApp2 { class Program { static void Main(stri ...
- [ python ] 类的组合
首先,使用面向对象是一个人狗大战的实例: class Person: def __init__(self, name, hp, aggr, sex): self.name = name self.hp ...
- mui页面跳转
$('.mui-title').on('click',function(){ mui.openWindow({ //跳转到指导信息页面 url:"/index.php?m=mobile&am ...