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的更多相关文章

  1. hdu 5692 Snacks 线段树+dfs

    Snacks Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Sub ...

  2. hdu-5692 Snacks(dfs序+线段树)

    题目链接: Snacks Problem Description   百度科技园内有n个零食机,零食机之间通过n−1条路相互连通.每个零食机都有一个值v,表示为小度熊提供零食的价值. 由于零食被频繁的 ...

  3. HDU5692 Snacks DFS序 线段树

    去博客园看该题解 题目 HDU5692 Snacks Problem Description 百度科技园内有n个零食机,零食机之间通过n−1条路相互连通.每个零食机都有一个值v,表示为小度熊提供零食的 ...

  4. HDU.5692 Snacks ( DFS序 线段树维护最大值 )

    HDU.5692 Snacks ( DFS序 线段树维护最大值 ) 题意分析 给出一颗树,节点标号为0-n,每个节点有一定权值,并且规定0号为根节点.有两种操作:操作一为询问,给出一个节点x,求从0号 ...

  5. HDU 5692 Snacks bfs版本dfs序 线段树

    Snacks 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5692 Description 百度科技园内有n个零食机,零食机之间通过n−1条路相互连 ...

  6. hdu 5692 Snacks(dfs时间戳+线段树)

    Snacks Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Sub ...

  7. HDU5692 Snacks

    HDU5692 Snacks Problem Description 百度科技园内有n个零食机,零食机之间通过n−1条路相互连通.每个零食机都有一个值v,表示为小度熊提供零食的价值. 由于零食被频繁的 ...

  8. HDU 5692 Snacks(DFS序+线段树)

    Snacks Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Sub ...

  9. Codeforces Round #584 D. Cow and Snacks

    链接: https://codeforces.com/contest/1209/problem/D 题意: The legendary Farmer John is throwing a huge p ...

随机推荐

  1. 在Node.js中使用RabbitMQ系列一 Hello world

    在前一篇文章中可伸缩架构简短系列中提到过关于异步的问题.当时推荐使用RabbitMQ来做任务队列的实现方案.本篇文章以Node.js为例子,来实际操作如何和RabbitMQ进行交互. 介绍 Rabbi ...

  2. Hibernate介绍和入门案例

    一身转战三千里,一剑曾当百万师 如果你在之前没有学过SSH三大框架,那么你之前肯定是通过JDBC来对数据库进行操作.现在,你完全可以把跟数据库交互的操作直接交给Hibernate. Hibernate ...

  3. 前端学习——ionic/AngularJs——获取验证码倒计时按钮

     按钮功能为:点击"获取验证码"--按钮不可用-设置倒计时-60秒后重新获取. 代码借鉴于:http://plnkr.co/edit/Swj82MpJSix3a47jZRHP?p= ...

  4. oracle——用户

    新增用户 用system用户登录 CREATE USER TEST1 IDENTIFIED BY TEST1; CREATE USER:创建用户命令,后跟用户名: IDENTIFIED BY:后跟密码 ...

  5. 【.NET】字符串处理类库

    类名:DealString,方法清单列好在头上. /// 1.截取字符串,最后加3个小数点 /// 2.获得指定Url的参数的string类型值 /// 3.判断数据类型 /// 4.过滤JS标记 / ...

  6. Nuget 学习一

    初识Nuget 对应C#开发的人员来说, DLL和相关的引用 并不陌生吧,通过手动拷贝DLL 存在很多问题, 比如SOA的实体DLL,开发者和使用者的DLL不一致,就可能存在字段的不一致, 通过Nug ...

  7. Theos 工程make package时报错

    错误: /Applications/Xcode.app/Contents/Developer/usr/bin/make package requires you to have a layout/ d ...

  8. 文档在线预览开源实现方案一:OpenOffice + SwfTools + FlexPaper

    在文档在线预览方面,项目组之前使用的是Microsoft office web apps, 由于该方案需要按照微软License付费,项目经理要我预研一个文档在线预览的开源实现方案.仔细钻入该需求发现 ...

  9. VMware虚拟机服务的vmware-hostd自动启动和停止

    安装了虚拟机 任务管理器会出现vmware-hostd.exe  占用了80端口,导致xampp打不开,所以就想关闭vmware,解决方案如下: 开始——运行——services.msc,找到VM打头 ...

  10. C#编码好习惯,献给所有热爱c#的同学

    1. 避免将多个类放在一个文件里面. 2. 一个文件应该只有一个命名空间,避免将多个命名空间放在同一个文件里面. 3. 一个文件最好不要超过500行的代码(不包括机器产生的代码). 4. 一个方法的代 ...