Snacks
Snacks
题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=5692
dfs序+线段树
这道题涉及到对整棵树的值修改,考虑将树状结构用dfs序转化成线性结构,将树的修改转化为区间修改以降低时间复杂度(之前组队赛的时候遇到一道类似的没调出来...代码能力太缺乏了...)
代码如下:
#include<cstdio>
#include<vector>
#include<iostream>
#include<cstring>
#pragma comment(linker, "/STACK:1024000000,1024000000")
#define LL long long
#define N 100100
#define lson (x<<1)
#define rson (x<<1|1)
#define mid ((l+r)>>1)
using namespace std;
struct node{
LL sum,lazy;
}a[N<<];
LL val[N];
int L[N],R[N];
LL spre[N];
int index;
bool vis[N];
vector<int>e[N];
void init(){
//for(int i=0;i<N;++i)e[i].clear();
//memset(a,0,sizeof(a));
memset(vis,,sizeof(vis));
memset(L,,sizeof(L));
memset(R,,sizeof(R));
memset(val,,sizeof(val));
memset(spre,,sizeof(spre));
index=;
}
void dfs(int num,LL v){
vis[num]=;
++index;
L[num]=index;
for(LL i=;i<e[num].size();i++)
if(!vis[e[num][i]])dfs(e[num][i],v+val[e[num][i]]);
e[num].clear();
spre[L[num]]=v;
R[num]=index;
}
void push_up(int x){
a[x].sum=max(a[lson].sum,a[rson].sum);
}
void push_down(int x){
a[rson].sum+=a[x].lazy;
a[rson].lazy+=a[x].lazy;
a[lson].sum+=a[x].lazy;
a[lson].lazy+=a[x].lazy;
a[x].lazy=;
}
void build(int x,int l,int r){
a[x].lazy=a[x].sum=;
if(l==r){
a[x].sum=spre[l];
return;
}
build(lson,l,mid);
build(rson,mid+,r);
push_up(x);
}
void add(int x,int l,int r,int cl,int cr,LL v){
if(cl<=l&&r<=cr){
a[x].sum+=v;
a[x].lazy+=v;
return;
}
if(a[x].lazy!=)push_down(x);/**except this!!!**/
if(cl<=mid)add(lson,l,mid,cl,cr,v);
if(mid<cr)add(rson,mid+,r,cl,cr,v);
push_up(x);
}
LL query(int x,int l,int r,int ql,int qr){
if(ql<=l&&r<=qr)return a[x].sum;
if(a[x].lazy!=)push_down(x);
LL temp=-(LL);
if(ql<=mid)temp=max(temp,query(lson,l,mid,ql,qr));
if(mid<qr)temp=max(temp,query(rson,mid+,r,ql,qr));
return temp;
}
int main(void){
int T,n,m;
scanf("%d",&T);
for(int i=;i<=T;++i){
/*if(i==10)while(1);
WA when i==10*/
init();
scanf("%d%d",&n,&m);
for(int j=;j<n;++j){
int x,y;
scanf("%d%d",&x,&y);x++,y++;
e[x].push_back(y);
e[y].push_back(x);
}
for(int j=;j<=n;++j)
scanf("%I64d",&val[j]);
dfs(,val[]);
build(,,n);
printf("Case #%d:\n",i);
while(m--){
int type;
scanf("%d",&type);
if(type==){
int x,v;
scanf("%d%d",&x,&v);x++;
LL diff=(LL)v-val[x];
val[x]=(LL)v;
add(,,n,L[x],R[x],diff);
}else if(type==){
int x;
scanf("%d",&x);x++;
LL temp=query(,,n,L[x],R[x]);
printf("%I64d\n",temp);
}
}
}
return ;
}
Snacks的更多相关文章
- 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,表示为小度熊提供零食的价值. 由于零食被频繁的 ...
- HDU5692 Snacks DFS序 线段树
去博客园看该题解 题目 HDU5692 Snacks Problem Description 百度科技园内有n个零食机,零食机之间通过n−1条路相互连通.每个零食机都有一个值v,表示为小度熊提供零食的 ...
- HDU.5692 Snacks ( DFS序 线段树维护最大值 )
HDU.5692 Snacks ( DFS序 线段树维护最大值 ) 题意分析 给出一颗树,节点标号为0-n,每个节点有一定权值,并且规定0号为根节点.有两种操作:操作一为询问,给出一个节点x,求从0号 ...
- HDU 5692 Snacks bfs版本dfs序 线段树
Snacks 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5692 Description 百度科技园内有n个零食机,零食机之间通过n−1条路相互连 ...
- hdu 5692 Snacks(dfs时间戳+线段树)
Snacks Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Sub ...
- HDU5692 Snacks
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 ...
- Codeforces Round #584 D. Cow and Snacks
链接: https://codeforces.com/contest/1209/problem/D 题意: The legendary Farmer John is throwing a huge p ...
随机推荐
- docker--------------实践(转载)
在私有云的容器化过程中,我们并不是白手起家开始的.而是接入了公司已经运行了多年的多个系统,包括自动编译打包,自动部署,日志监控,服务治理等等系统.在容器化之前,基础设施主要以物理机和虚拟机为主.因此, ...
- java初学者
决心开始从头学习java,并且每天记录自己的学习进度与学习成果,用于分享和促进. 鉴于是新手,并且之前也没有任何发文的经历,可能更多的是根据自己已有的知识容量基础之上进行的深化,太基础的看一遍就能会的 ...
- iOS Quartz2D画图
对于刚接触Quartz2D的同学来说,先了解 上下文 的概念,再从最基础的画线来具体体验Quartz2D的画图步骤 介绍Quart2D :是苹果官方的二维(平面)绘图引擎,同时支持iOS和macOS系 ...
- 关于【IE兼容】的都在这
滚动条 ie的滚动条覆盖了内容,为了触屏操作优化浏览器的内容显示,IE 浏览器提供了一种可以浮动显示,自动隐藏的滚动条样式,但是这个样式会在某些情况下造成一些困扰,比如下图... 其实默认情况下,桌面 ...
- java-并发解决方案
并发产生数据不一致的原因:1.程序共享对象:2.多线程.3.基于1和2,取出来的数据可能不是最新的. 解决方案:只要是原子性操作,就不会出现问题.原子性操作,代表cpu会一直执行这个操作,知道结束. ...
- nohup及/dev/null使用
1.nohup ----后台执行,执行记录默认输出到当前目录下的nohup.out文件 nohup find /etc -name passwd 2./dev/null介绍 把/ ...
- Everything(速度快的文件搜索软件) 1.4.1.801b 汉化绿色版
软件名称: Everything(速度快的文件搜索软件) 软件语言: 简体中文 授权方式: 免费软件 运行环境: Win7 / Vista / Win2003 / WinXP 软件大小: 2.0MB ...
- Html5浏览器端less应用
之前的一个布局是用rem来做的 我上一段代码 div { margin: 0.833333333rem 0; } /* 去处a标签的下划线*/ a { text-decoration: none; } ...
- django manage.py 的各种功能
[简介] django-admin.py是Django的一个用于管理任务的命令行工具.本文将描述它的大概用法. 另外,在每一个Django project中都会有一个manage.py.manage. ...
- 认识css
(一)认识css: CSS全称为"层叠样式表 (Cascading Style Sheets)",它主要是用于定义HTML内容在浏览器内的显示样式,如文字大小.颜色.字体加粗等. ...