hdu 5692(dfs+线段树) Snacks
题目http://acm.hdu.edu.cn/showproblem.php?pid=5692
题目说每个点至多经过一次,那么就是只能一条路线走到底的意思,看到这题的格式,
多个询问多个更新,
自然而然的就会想到线段树或者树状数组,在建树前先做处理,
用DFS将从起点0出发到任一点的距离求出,
然后将这些节点按照一条一条完整的路线的顺序建到树中,
比如样例是1---2---3
|
6 ---4----5
所以建树的其中一种顺序是1 4 5 6 2 3 。当查询的时候的区间应该是从现在这个点开始到这条路线上的终点,更新的时候也是这个区间更新,相当于把这个区间的所有数都加上一个数,与 poj 3468 类似,lazy操作。
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std; typedef long long ll;
const int M = 1e5 + ;
int head[M],cas,num[M],ans,st[M],ed[M];
ll sum[M],a[M]; ll max(ll x,ll y) {return x>y?x:y;} struct Edge{
int to;
int next;
}edge[M*]; void add(int x,int y)
{
edge[cas].to=x;
edge[cas].next=head[y];
head[y]=cas++;
} void dfs(int x,int y)
{
st[x]=++ans;num[ans]=x;
sum[x]+=sum[y];
for (int i=head[x] ; i!=- ; i=edge[i].next)
{
int v=edge[i].to;
if (v==y) continue;
dfs(v,x);
}
ed[x]=ans;
}
struct Tree{
int l,r;
ll ans,mark;
}tree[M*]; void down(int i)
{
if(tree[i].mark)
{
tree[i*].mark+=tree[i].mark;tree[i*+].mark+=tree[i].mark;
tree[i*].ans+=tree[i].mark;tree[i*+].ans+=tree[i].mark;
tree[i].mark=;
}
} void build(int i,int left,int right)
{
tree[i].l=left;tree[i].r=right;
tree[i].mark=;
if (left==right){tree[i].ans=sum[num[left]];return ;}
int mid=(left+right)/;
build(i*,left,mid);
build(i*+,mid+,right);
tree[i].ans=max(tree[i*].ans,tree[i*+].ans);
} ll findest(int i,int left,int right)
{
if(tree[i].l>=left&&tree[i].r<=right)
return tree[i].ans;
down(i);
int mid=(tree[i].l+tree[i].r)/;
if(mid>=right){return findest(i*,left,right);}
else if(mid<left){return findest(i*+,left,right);}
else{return max(findest(i*,left,mid),findest(i*+,mid+,right));} }
void update(int i,int left,int right,ll pos)
{
if(tree[i].l>=left&&tree[i].r<=right){tree[i].mark+=pos;tree[i].ans+=pos;return;}
int mid=(tree[i].l+tree[i].r)/;
down(i);
if(mid<left) update(i*+,left,right,pos);
else if(mid>=right) update(i*,left,right,pos);
else
{
update(i*,left,mid,pos);
update(i*+,mid+,right,pos);
}
tree[i].ans=max(tree[i*].ans,tree[i*+].ans);
} int main()
{
int t,n,m,e=;
scanf("%d",&t);
while (t--)
{
printf("Case #%d:\n",++e);
scanf("%d%d",&n,&m);
memset(head,-,sizeof(head));
for (int i= ; i<n ; i++){
int a,b;
scanf("%d%d",&a,&b);
a++,b++;
add(a,b);add(b,a);
}
cas=;ans=;
for (int i= ; i<=n ; i++) scanf("%I64d",&a[i]),sum[i]=a[i];
dfs(,);
build(,,n);
while (m--)
{
int w,b;ll c;
scanf("%d",&w);
if (w){
scanf("%d",&b);b++;
printf("%I64d\n",findest(,st[b],ed[b]));
}
else{
scanf("%d%I64d",&b,&c);b++;
ll q=c-a[b];
a[b]=c;
update(,st[b],ed[b],q);
}
}
}
return ;
}
hdu 5692(dfs+线段树) Snacks的更多相关文章
- HDU 5877 dfs+ 线段树(或+树状树组)
1.HDU 5877 Weak Pair 2.总结:有多种做法,这里写了dfs+线段树(或+树状树组),还可用主席树或平衡树,但还不会这两个 3.思路:利用dfs遍历子节点,同时对于每个子节点au, ...
- Snacks HDU 5692 dfs序列+线段树
Snacks HDU 5692 dfs序列+线段树 题意 百度科技园内有n个零食机,零食机之间通过n−1条路相互连通.每个零食机都有一个值v,表示为小度熊提供零食的价值. 由于零食被频繁的消耗和补充, ...
- hdu 4031 attack 线段树区间更新
Attack Time Limit: 5000/3000 MS (Java/Others) Memory Limit: 65768/65768 K (Java/Others)Total Subm ...
- hdu 4288 离线线段树+间隔求和
Coder Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Su ...
- hdu 3016 dp+线段树
Man Down Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total S ...
- Codeforces1110F Nearest Leaf dfs + 线段树 + 询问离线
Codeforces1110F dfs + 线段树 + 询问离线 F. Nearest Leaf Description: Let's define the Eulerian traversal of ...
- dfs+线段树 zhrt的数据结构课
zhrt的数据结构课 这个题目我觉得是一个有一点点思维的dfs+线段树 虽然说看起来可以用树链剖分写,但是这个题目时间卡了树剖 因为之前用树剖一直在写这个,所以一直想的是区间更新,想dfs+线段树,有 ...
- hdu 5692(dfs序+线段树,好题)
Snacks Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Sub ...
- HDU 3974 Assign the task (DFS+线段树)
题意:给定一棵树的公司职员管理图,有两种操作, 第一种是 T x y,把 x 及员工都变成 y, 第二种是 C x 询问 x 当前的数. 析:先把该树用dfs遍历,形成一个序列,然后再用线段树进行维护 ...
随机推荐
- StarRatingBar星星切换动画《IT蓝豹》
StarRatingBar星星切换动画 StarRatingBar星星切换动画,很久没有学习一下这个RatingBar了,今天来看看这个RatingBar的动画切换效果,本例子主要是RatingBar ...
- spring boot 开发非web应用程序
- CentOS下mysql数据库常用命令
1.更改root密码 mysqladmin -uroot password 'yourpassword' 2.远程登陆mysql服务器 mysql -uroot -p -h192.168.137.10 ...
- JAVA语言 第三周
第三周,跟随菜鸟教程学习了一些简单的JAVA语法,包括数据类型.变量.修饰符.运算符.循环.数组.继承. 这些在结构中与c++相似,但语法有些不同.在这些方面,我做了一些总结. 开学测试那张卷子,被我 ...
- 微信小程序生命周期——小程序的生命周期及页面的生命周期。
最近在做微信小程序开发,也发现一些坑,分享一下自己踩过的坑. 生命周期是指一个小程序从创建到销毁的一系列过程. 在小程序中 ,通过App()来注册一个小程序 ,通过Page()来注册一个页面. 首先来 ...
- wamp添加本地虚拟域名
修改一下文件位置,引入文件 下面是配置文件添加配置指向目录 <VirtualHost *:80> ServerAdmin 979996962@qq.com DocumentRoot &qu ...
- OpenCV批量读入(处理)
#include <windows.h> #include <iostream> #include <opencv2/opencv.hpp> using names ...
- Physical (Raw) Versus Logical Backups
[Physical (Raw) Versus Logical Backups] Physical backups consist of raw copies of the directories an ...
- Oracle11g RAC安装
双节点RAC环境,数据库 racdb 实例1:racdb1 实例2:racdb2 1.IP规划 名称 oracle-db1 oracle-db2PUBLIC I ...
- ucore-lab1-练习3report
练习3.分析bootload进入保护模式的过程 0. BIOS通过读取硬盘主引导扇区到内存,并跳转到对应内存中的位置,也就是从’%cs=0 $pc=0x7c00‘进入并执行bootloader,boo ...