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 ...
随机推荐
- pch文件的作用和配置
pch文件说白了就是一个头文件,只不过这个头文件的类在全局都可以使用,所以说非常的方便,并不用在每个类里面都写一些重复类的头文件,只要将用到的类的头文件放到pch文件里面就行了,当然了还有就是宏定义, ...
- Android自定义控件系列(一)—Button七十二变
转载请注明出处:http://www.cnblogs.com/landptf/p/6290791.html 忙了一段时间,终于有时间整理整理之前所用到的一些知识,分享给大家,希望给同学们有些帮助,同时 ...
- Python 购物车----之用户部分
知识点: 文件读,写操作,if 判断, for 循环 salary = input("输入你的工资:") bought_list = [] product_list = {} wi ...
- Spark集群搭建步骤
问题: 参考:Spark快速入门指南 – Spark安装与基础使用
- 【01背包】HDU 2602 Bone Collector (模板题)
Problem Description Many years ago , in Teddy's hometown there was a man who was called "Bone C ...
- 如何得到AdoConnection.execute(sqlstr)执行的返回结果
如何得到AdoConnection.execute(sqlstr)执行的返回结果? 1: TAdoConnection.execute有procedure.function的两种定义,function ...
- 关于对HandlerThread的了解
在Android中经常需要创建一个循环线程,有耗时操作时候,放到里面去操作,如果没有耗时操作,就让该线程处于等待,但是不要杀死它, 最好不要一旦有耗时任务,就立刻创建一个新线程,因为会有性能问题. H ...
- php学习笔记——语言切换
现在的网站很多都可以实现多语言,于是记录一下多语言的实例. 方法一:通过将所有显示在页面的字段放在一个message文件里面来实现 思路如下图: test代码: main.php: <?php ...
- empty,is_null,isset返回值的比较
empty,is_null,isset返回值的比较: 变量 empty is_null isset$a="& ...
- 主成分分析(Principal components analysis)-最大方差解释
原文:http://www.cnblogs.com/jerrylead/archive/2011/04/18/2020209.html 在这一篇之前的内容是<Factor Analysis> ...