hdu5692 Snacks dfs序+线段树

题目传送门

题目大意:给出一颗树,根节点是0,有两种操作,一是修改某个节点的value,二是查询,从根节点出发,经过 x 节点的路径的最大值。

思路:用树状数组写发现还是有些麻烦,最后用线段树了。

   其实这道题的查询,就是查询从根节点到x节点+x节点走下去的路径的最大值,这样会发现,其实就是查询包括x节点的所有子树中权值最大的那个,而包括x节点的子树,如果用dfs序转换一下的话,可以在线段上用一段连续的点表示出来,所以最后就转换成了线段树区间求最大值,然后单点修改的题目了。

  要注意的是dfs序和原标号的对应,有一个地方弄反了,卡了好久。

#pragma comment(linker, "/STACK:1024000000,1024000000") 
#include<cstdio>
#include<cstring>
#include<stdlib.h>
#include<algorithm>
#include<iostream>
#include<cmath>
#include<map>
#define CLR(a,b) memset(a,b,sizeof(a))
#define PI acos(-1)
#define lson rt*2,l,(l+r)/2
#define rson rt*2+1,(l+r)/2+1,r
using namespace std;
typedef long long ll;
const int inf=0x3f3f3f3f;
const int maxn=100010;
struct edge{int to,Next;
}e[maxn*2];
int tot,m,n,head[maxn],pos,dfn[maxn],fa[maxn],son[maxn],l[maxn],r[maxn];
ll val[maxn],dis[maxn];
inline void init(){CLR(head,-1),tot=0,pos=0;CLR(dis,0);fa[1]=1;
}
inline void addv(int u,int v){e[++tot]={v,head[u]};head[u]=tot;
}
ll tree[maxn << 2], laz[maxn << 2];
inline void pushup(int rt) {tree[rt] = max(tree[rt << 1], tree[rt << 1 | 1]);
}
inline void pushdown(int rt) {if (laz[rt]) {tree[rt << 1] += laz[rt];tree[rt << 1 | 1] += laz[rt];laz[rt << 1] += laz[rt];laz[rt << 1 | 1] += laz[rt];laz[rt] = 0;}
}
inline void build(int rt, int l, int r) {laz[rt] = 0;if (l == r) {tree[rt] = dis[l];return ;}build(lson);build(rson);pushup(rt);
}
inline void update(int L, int R, ll v, int rt, int l, int r) {if (L <= l && R >= r) {tree[rt] += v;laz[rt] += v;return;}pushdown(rt);if (L <= (l + r) / 2)   update(L, R, v, lson);if (R > (l + r) / 2)    update(L, R, v, rson);pushup(rt);
}
inline ll query(int L, int R, int rt, int l, int r) { if (L <= l && R >= r) {return tree[rt];}pushdown(rt);if (L > (l + r) / 2)    return query(L,R,rson);else if (R <= (l + r) / 2)  return query(L,R,lson);else return max(query(L,R,lson),query(L,R,rson));
}inline void dfs(int u,int pre){dfn[u]=++pos;l[u]=pos;son[u]=1;dis[dfn[u]]=dis[dfn[pre]]+val[u];for(int i=head[u];i!=-1;i=e[i].Next){int v=e[i].to;if(v==fa[u])continue;fa[v]=u;dfs(v,u);son[u]+=son[v];}r[u]=pos;
}
int main(){int T,cas=1;cin>>T;while(T--){init();scanf("%d%d",&n,&m);for(int i=1;i<n;i++){int u,v;scanf("%d%d",&u,&v);addv(u+1,v+1);addv(v+1,u+1);}for(int i=1;i<=n;i++)scanf("%lld",&val[i]);dfs(1,1);build(1,1,n);printf("Case #%d:\n",cas++);while(m--){int op,x;ll y;scanf("%d%d",&op,&x);if(op==1){//    printf("debug  %d  %d\n",dfn[x+1],dfn[x+1]+son[x+1]-1);
            printf("%lld\n",query(l[x+1],r[x+1],1,1,n));}else{scanf("%lld",&y);update(l[x+1],r[x+1],y-val[x+1],1,1,n);val[x+1]=y;}}}
}

Snacks

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


Problem Description
百度科技园内有n个零食机,零食机之间通过n1条路相互连通。每个零食机都有一个值v,表示为小度熊提供零食的价值。

由于零食被频繁的消耗和补充,零食机的价值v会时常发生变化。小度熊只能从编号为0的零食机出发,并且每个零食机至多经过一次。另外,小度熊会对某个零食机的零食有所偏爱,要求路线上必须有那个零食机。

为小度熊规划一个路线,使得路线上的价值总和最大。

 

Input
输入数据第一行是一个整数T(T10),表示有T组测试数据。

对于每组数据,包含两个整数n,m(1n,m100000),表示有n个零食机,m次操作。

接下来n1行,每行两个整数xy(0x,y<n),表示编号为x的零食机与编号为y的零食机相连。

接下来一行由n个数组成,表示从编号为0到编号为n1的零食机的初始价值v(|v|<100000)

接下来m行,有两种操作:0 x y,表示编号为x的零食机的价值变为y1 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

转载于:https://www.cnblogs.com/mountaink/p/9863097.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/388124.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python数据建模数据集_Python中的数据集

python数据建模数据集There are useful Python packages that allow loading publicly available datasets with just a few lines of code. In this post, we will look at 5 packages that give instant access to a range of datasets. For each package, we will look at h…

打开editor的接口讨论

【打开editor的接口讨论】 先来看一下workbench吧&#xff0c;workbench从静态划分应该大致如下&#xff1a; 从结构图我们大致就可以猜测出来&#xff0c;workbench page作为一个IWorkbenchPart&#xff08;无论是eidtor part还是view part&#…

【三角函数】已知直角三角形的斜边长度和一个锐角角度,求另外两条直角边的长度...

如图,已知直角三角形ABC中,∠C90, ∠Aa ,ABc ,求直角边AC、BC的长度. ∵ ∠C90,∠Aa ,ABc ,Cos∠AAC/AB ,Sin∠ABC/AB ,∴ ACAB*Cos∠Ac*Cosa ,BCAB*Sin∠Ac*Sina . 复制代码

网络攻防技术实验五

2018-10-23 实验五 学 号201521450005 中国人民公安大学 Chinese people’ public security university 网络对抗技术 实验报告 实验五 综合渗透 学生姓名 陈军 年级 2015 区队 五 指导教师 高见 信息技术与网络安全学院 2018年10月23日 实验任务总纲 2018—2019 …

usgs地震记录如何下载_用大叶草绘制USGS地震数据

usgs地震记录如何下载One of the many services provided by the US Geological Survey (USGS) is the monitoring and tracking of seismological events worldwide. I recently stumbled upon their earthquake datasets provided at the website below.美国地质调查局(USGS)…

Springboot 项目中 xml文件读取yml 配置文件

2019独角兽企业重金招聘Python工程师标准>>> 在xml文件中读取yml文件即可&#xff0c;代码如下&#xff1a; 现在spring-boot提倡零配置&#xff0c;但是的如果要集成老的spring的项目&#xff0c;涉及到的bean的配置。 <bean id"yamlProperties" clas…

eclipse 插件打包发布

如果想把调试好的插件打包发布&#xff0c;并且在ECLIPSE中可以使用. 1.File-->Export 2.选择 PLug-in Development下 的 Deployable plug-ins and fragments 3.进入 Deployable plug-ins and fragments 页面 4.把底下的 Destubatuib 的选项中选择 Archive file 在这里添入要…

无法获取 vmci 驱动程序版本: 句柄无效

https://jingyan.baidu.com/article/a3a3f811ea5d2a8da2eb8aa1.html 将 vmci0.present "TURE" 改为 “FALSE”; 转载于:https://www.cnblogs.com/limanjihe/p/9868462.html

数据可视化 信息可视化_更好的数据可视化的8个技巧

数据可视化 信息可视化Ggplot is R’s premier data visualization package. Its popularity can likely be attributed to its ease of use — with just a few lines of code you are able to produce great visualizations. This is especially great for beginners who are…

分布式定时任务框架Elastic-Job的使用

为什么80%的码农都做不了架构师&#xff1f;>>> 一、前言 Elastic-Job是一个优秀的分布式作业调度框架。 Elastic-Job是一个分布式调度解决方案&#xff0c;由两个相互独立的子项目Elastic-Job-Lite和Elastic-Job-Cloud组成。 Elastic-Job-Lite定位为轻量级无中心化…

Memcached和Redis

Memcached和Redis作为两种Inmemory的key-value数据库&#xff0c;在设计和思想方面有着很多共通的地方&#xff0c;功能和应用方面在很多场合下(作为分布式缓存服务器使用等) 也很相似&#xff0c;在这里把两者放在一起做一下对比的介绍 基本架构和思想 首先简单介绍一下两者的…

第4章 springboot热部署 4-1 SpringBoot 使用devtools进行热部署

/imooc-springboot-starter/src/main/resources/application.properties #关闭缓存, 即时刷新 #spring.freemarker.cachefalse spring.thymeleaf.cachetrue#热部署生效 spring.devtools.restart.enabledtrue #设置重启的目录,添加那个目录的文件需要restart spring.devtools.r…

border-radius 涨知识的写法

<div idapp></div>复制代码#app{width:100%;height:80px;background:pink;border-radius:75%/20% 20% 0 0;}复制代码仅供自己总结记忆转载于:https://juejin.im/post/5c80afd66fb9a049f81a1217

ibm python db_使用IBM HR Analytics数据集中的示例的Python独立性卡方检验

ibm python dbSuppose you are exploring a dataset and you want to examine if two categorical variables are dependent on each other.假设您正在探索一个数据集&#xff0c;并且想要检查两个分类变量是否相互依赖。 The motivation could be a better understanding of …

Oracle优化检查表

分类检查项目相关文件或结果状态备注日志及文件Oracle Alert 日志bdump/udump下是否存在明显的报警listener相关日志SQL* Net日志参数/参数文件listener.ora/tnsnames.ora操作系统操作系统版本检查操作系统补丁节点名操作系统vmstat状态操作系统I/O状态操作系统进程情况操作系统…

spring分布式事务学习笔记(2)

此文已由作者夏昀授权网易云社区发布。欢迎访问网易云社区&#xff0c;了解更多网易技术产品运营经验。Model类如下&#xff1a;package com.xy.model1 package com.xy.model;2 3 /**4 * Created by helloworld on 2015/1/30.5 */6 public class NameQa {7 private long …

sql 左联接 全联接_通过了解自我联接将您SQL技能提升到一个新的水平

sql 左联接 全联接The last couple of blogs that I have written have been great for beginners ( Data Concepts Without Learning To Code or Developing A Data Scientist’s Mindset). But, I would really like to push myself to create content for other members of …

如何查看linux中文件打开情况

如何查看linux中文件打开情况 前言 我们都知道&#xff0c;在linux下&#xff0c;“一切皆文件”&#xff0c;因此有时候查看文件的打开情况&#xff0c;就显得格外重要&#xff0c;而这里有一个命令能够在这件事上很好的帮助我们-它就是lsof。 linux下有哪些文件 在介绍lsof命…

hadoop windows

1、安装JDK1.6或更高版本 官网下载JDK&#xff0c;安装时注意&#xff0c;最好不要安装到带有空格的路径名下&#xff0c;例如:Programe Files&#xff0c;否则在配置Hadoop的配置文件时会找不到JDK&#xff08;按相关说法&#xff0c;配置文件中的路径加引号即可解决&#xff…

Ocelot中文文档入门

入门 Ocelot仅适用于.NET Core&#xff0c;目前是根据netstandard2.0构建的&#xff0c;如果Ocelot适合您&#xff0c;这个文档可能会有用。 .NET Core 2.1 安装NuGet包 使用nuget安装Ocelot及其依赖项。 您需要创建一个netstandard2.0项目并将其打包到其中。 然后按照下面的“…