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 ...
随机推荐
- labview 调用 matlab script的神坑! Error 1050 occurred at LabVIEW
显示变量没有被定义,原因是clear 关键字的问题,去掉即可!!! 未找到 文件路径,定位: 文件路径中不能有中文路径
- 【CodeVS】1293
输入输出样例 思路:看到题目我萌第一眼想到的肯定是求联通快对吧,但是这个联通快有点奇特,因为 这样他也算是一个联通快.解决此题其实有三种解法:1)宽搜(这个符合基本法):2)并查集:3)灌水法 但是蒟 ...
- 如何写兼容浏览器和Node.js环境的Javascript代码
如果有打开过jQuery的源码(从1.11及以后),或者Vue.js.React.js的源码,都会在文件的前面看见这样一段代码: ( function( global, factory ) { &qu ...
- IMAX公司CEO:进军VR产业,打造VR体验中心
591ARVR资讯网www.591arvr.com报道近日,<财富>杂志采访了IMAX首席执行官理查德·葛尔方(Richar Gelfond),后者谈了谈虚拟现实和IMAX正在打造的VR影 ...
- Java模拟post-get提交
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import ...
- Android平台 视频编辑的高级版本
基本覆盖了秒拍,美拍,快手等视频编辑的大部分功能. 增加了44种滤镜,基本覆盖市面上大部分APP中的滤镜效果. 可以实现视频和视频, 视频和图片,视频和您的UI界面叠加. 在叠加的过程中:支持任意时间 ...
- 网页数据抓取(B/S)
C# 抓取网页内容(转) 1.抓取一般内容 需要三个类:WebRequest.WebResponse.StreamReader 所需命名空间:System.Net.System.IO 核心代码: We ...
- jmeter java性能测试
本篇文章主要讲解jmeter如何测试java请求,以项目中某个接口为例,请求数据为post,返回也为post 1:新建maven工程,pom文件为 <project xmlns="ht ...
- 修复ubunut桌面
title: 修复ubunut桌面 tags: 桌面, ubuntu grammar_cjkRuby: true --- ,按下Ctrl+Alt+F2.这会让你进入一个命令行界面而不是默认的用户桌面界 ...
- Python学习笔记——进阶篇【第九周】———协程
协程 协程,又称微线程,纤程.英文名Coroutine.一句话说明什么是协程:协程是一种用户态的轻量级线程. 协程拥有自己的寄存器上下文和栈.协程调度切换时,将寄存器上下文和栈保存到其他地方,在切回来 ...