O - Snacks(DFS序)
由于零食被频繁的消耗和补充,零食机的价值vv会时常发生变化。小度熊只能从编号为0的零食机出发,并且每个零食机至多经过一次。另外,小度熊会对某个零食机的零食有所偏爱,要求路线上必须有那个零食机。
为小度熊规划一个路线,使得路线上的价值总和最大。
Input输入数据第一行是一个整数T(T≤10)T(T≤10),表示有TT组测试数据。
对于每组数据,包含两个整数n,m(1≤n,m≤100000)n,m(1≤n,m≤100000),表示有nn个零食机,mm次操作。
接下来n−1n−1行,每行两个整数xx和y(0≤x,y<n)y(0≤x,y<n),表示编号为xx的零食机与编号为yy的零食机相连。
接下来一行由nn个数组成,表示从编号为0到编号为n−1n−1的零食机的初始价值v(|v|<100000)v(|v|<100000)。
接下来mm行,有两种操作:0 x y0 x y,表示编号为xx的零食机的价值变为yy;1 x1 x,表示询问从编号为0的零食机出发,必须经过编号为xx零食机的路线中,价值总和的最大值。
本题可能栈溢出,辛苦同学们提交语言选择c++,并在代码的第一行加上:
`#pragma comment(linker, "/STACK:1024000000,1024000000") `Output对于每组数据,首先输出一行”Case #?:”,在问号处应填入当前数据的组数,组数从1开始计算。
对于每次询问,输出从编号为0的零食机出发,必须经过编号为xx零食机的路线中,价值总和的最大值。
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标记每个点的时间戳,并且记录到每个点的路径(同时开一个Rev数组,从时间戳返回到原节点,建线段树的时候要用到).
知道了每个节点的时间戳,就知道了该节点的子树的区间,为[Start[x],End[x]],更新的话用线段树区间更新,查询的话用线段树区间查询,用到lazy数组.
#pragma comment(linker, "/STACK:1024000000,1024000000")
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=;
const ll INF=0x3f3f3f3f3f3f3f3f;//这里一定是long long 啊啊啊啊
ll head[maxn],dis[maxn],w[maxn],Rev[maxn];
int Start[maxn],End[maxn];
int tot,cnt,n,m;
ll sum[maxn<<],lazy[maxn<<];
struct node
{
ll v,next;
}e[maxn<<];
void add(int u,int v)
{
e[tot]=(node){v,head[u]};
head[u]=tot++;
}
void DFS(int u,int pre)
{
Start[u]=++cnt;
Rev[cnt]=u;
for(int i=head[u];i!=-;i=e[i].next){
int v=e[i].v;
if(v==pre)continue;
dis[v]=dis[u]+w[v];
DFS(v,u);
}
End[u]=cnt;
}
void pushup(int rt)
{
sum[rt]=max(sum[rt*],sum[rt*+]);
}
void pushdown(int rt)
{
if(lazy[rt]){
lazy[rt<<]+=lazy[rt];
lazy[rt<<|]+=lazy[rt];
sum[rt<<]+=lazy[rt];
sum[rt<<|]+=lazy[rt];
lazy[rt]=;
}
}
void build(int l,int r,int rt)
{
lazy[rt]=;
if(l==r){
sum[rt]=dis[Rev[l]];
return ;
}
int mid=(l+r)/;
build(l,mid,rt*);
build(mid+,r,rt*+);
pushup(rt);
}
void update(int L,int R,int w,int l,int r,int rt)//[L,R]区间加上w
{
if(L<=l&&R>=r){
sum[rt]+=w;
lazy[rt]+=w;
return ;
}
pushdown(rt);
int mid=(l+r)>>;
if(L<=mid)update(L,R,w,l,mid,rt<<);
if(R>=mid+)update(L,R,w,mid+,r,rt<<|);
pushup(rt);
}
ll querymax(int L,int R,int l,int r,int rt)
{
if(L<=l&&R>=r){
return sum[rt];
}
pushdown(rt);
ll ans=-INF;
int mid=(l+r)>>;
if(L<=mid)ans=max(ans,querymax(L,R,l,mid,rt<<));
if(R>=mid+)ans=max(ans,querymax(L,R,mid+,r,rt<<|));
return ans;
}
int main()
{
int T,k=;
scanf("%d",&T);
while(T--){
cnt=tot=;
scanf("%d%d",&n,&m);
memset(head,-,sizeof(head)); for(int i=;i<=n-;i++){
int u,v;
scanf("%d%d",&u,&v);
u++;
v++;
add(u,v);
add(v,u);
}
for(int i=;i<=n;i++)scanf("%lld",&w[i]);
dis[]=w[];
DFS(,-);
build(,n,);
printf("Case #%d:\n", k++);
while(m--){
int op,x,y;
scanf("%d%d",&op,&x);
x++;
if(op==){
printf("%lld\n",querymax(Start[x],End[x],,n,));
}
else{
scanf("%d",&y);
update(Start[x],End[x],y-w[x],,n,);
w[x]=y;
}
}
}
return ;
}
O - Snacks(DFS序)的更多相关文章
- HDU.5692 Snacks ( DFS序 线段树维护最大值 )
HDU.5692 Snacks ( DFS序 线段树维护最大值 ) 题意分析 给出一颗树,节点标号为0-n,每个节点有一定权值,并且规定0号为根节点.有两种操作:操作一为询问,给出一个节点x,求从0号 ...
- HDU5692 Snacks DFS序 线段树
去博客园看该题解 题目 HDU5692 Snacks Problem Description 百度科技园内有n个零食机,零食机之间通过n−1条路相互连通.每个零食机都有一个值v,表示为小度熊提供零食的 ...
- HDU 5692 Snacks(DFS序+线段树)
Snacks Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Sub ...
- hdu-5692 Snacks(dfs序+线段树)
题目链接: Snacks Problem Description 百度科技园内有n个零食机,零食机之间通过n−1条路相互连通.每个零食机都有一个值v,表示为小度熊提供零食的价值. 由于零食被频繁的 ...
- HDU 5692 Snacks bfs版本dfs序 线段树
Snacks 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5692 Description 百度科技园内有n个零食机,零食机之间通过n−1条路相互连 ...
- HDU5692(线段树+dfs序)
Snacks Time Limit:5000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u Submit Statu ...
- hdu5692【dfs序】【线段树】
Snacks Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Sub ...
- hdu 5692(dfs序+线段树,好题)
Snacks Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Sub ...
- BZOJ 3083: 遥远的国度 [树链剖分 DFS序 LCA]
3083: 遥远的国度 Time Limit: 10 Sec Memory Limit: 1280 MBSubmit: 3127 Solved: 795[Submit][Status][Discu ...
- BZOJ 4196: [Noi2015]软件包管理器 [树链剖分 DFS序]
4196: [Noi2015]软件包管理器 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 1352 Solved: 780[Submit][Stat ...
随机推荐
- Python String startswith() Method
一,摘自官方API https://docs.python.org/3/library/stdtypes.html#methods str.startswith(prefix[, start[, e ...
- cos改ip
IPADDRIP地址NETMASK子网掩码GATEWAY网关地址 通常,如果我们想更改主机地址为静态地址或者更改主机名,需要修改的几个文件包括:/etc/sysconfig/network Cento ...
- F5 BIG-IPLTM但比组网的三种连接模式(转)
原文链接:https://www.cnblogs.com/yujianadu/p/11850977.html作者:遇见阿杜
- idea 2018.3.4 破解
我的idea_home=C:\Program Files\\IntelliJ IDEA 2018.3.4\ 1.下载破解文件 链接:https://pan.baidu.com/s/1I2APmk-pj ...
- springboot整合redis简单示例
一.项目架构 二.项目内容 1.pom.xml <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi=&q ...
- [NSConcreteValue doubleValue]: unrecognized selector sent to instance
今天需求说要给在进入某个页面给某个按钮加上放大效果,心想这还不简单,于是三下五除二的把动画加上提交测试了. 下面是动画的代码 NSTimeInterval time = CACurrentMediaT ...
- Java 二维数组,排序、切换顺序,查表法二进制十进制,这班查找、排序(冒泡、选择)、遍历,获取最大小值(4)
Java 二维数组,排序.切换顺序,查表法二进制十进制,折半查找.排序(冒泡.选择).遍历,获取最大小值(4)
- 装饰器参数加log
#有多个函数,需要计算他们的执行时间,加logimport timedef logger(flag): def show_time(f): #foo对象 def inner(*x,**y): star ...
- 实例说明 PeekMessage与GetMessage的区别
PeekMessage与GetMessage的对比相同点:PeekMessage函数与GetMessage函数都用于查看应用程序消息队列,有消息时将队列中 的消息派发出去. 不同点:无论应用程序消息队 ...
- java 用condition&reentrylock实现生产者消费者
package com.lb; import java.util.ArrayList; import java.util.List; import java.util.concurrent.locks ...