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

  1. HDU 5877 dfs+ 线段树(或+树状树组)

    1.HDU 5877  Weak Pair 2.总结:有多种做法,这里写了dfs+线段树(或+树状树组),还可用主席树或平衡树,但还不会这两个 3.思路:利用dfs遍历子节点,同时对于每个子节点au, ...

  2. Snacks HDU 5692 dfs序列+线段树

    Snacks HDU 5692 dfs序列+线段树 题意 百度科技园内有n个零食机,零食机之间通过n−1条路相互连通.每个零食机都有一个值v,表示为小度熊提供零食的价值. 由于零食被频繁的消耗和补充, ...

  3. hdu 4031 attack 线段树区间更新

    Attack Time Limit: 5000/3000 MS (Java/Others)    Memory Limit: 65768/65768 K (Java/Others)Total Subm ...

  4. hdu 4288 离线线段树+间隔求和

    Coder Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Su ...

  5. hdu 3016 dp+线段树

    Man Down Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total S ...

  6. Codeforces1110F Nearest Leaf dfs + 线段树 + 询问离线

    Codeforces1110F dfs + 线段树 + 询问离线 F. Nearest Leaf Description: Let's define the Eulerian traversal of ...

  7. dfs+线段树 zhrt的数据结构课

    zhrt的数据结构课 这个题目我觉得是一个有一点点思维的dfs+线段树 虽然说看起来可以用树链剖分写,但是这个题目时间卡了树剖 因为之前用树剖一直在写这个,所以一直想的是区间更新,想dfs+线段树,有 ...

  8. hdu 5692(dfs序+线段树,好题)

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

  9. HDU 3974 Assign the task (DFS+线段树)

    题意:给定一棵树的公司职员管理图,有两种操作, 第一种是 T x y,把 x 及员工都变成 y, 第二种是 C x 询问 x 当前的数. 析:先把该树用dfs遍历,形成一个序列,然后再用线段树进行维护 ...

随机推荐

  1. asp.net 如何判断输入的值 包括 汉字?

    string input = " 里面是不是汉字 ";bool bl= System.Text.RegularExpressions.Regex.IsMatch(input, @& ...

  2. 做好Unity4.x开发项目规划

    1. 是否要用lua 2. (对于需操作的游戏)客户端游戏如何做战斗验证 下面列举小坑吧.不建议都绕开,毕竟没有那么多时间做前期调研的. 对应版本Unity4.x 1. 客户端程序层面 总的来说C#超 ...

  3. NTKO OFFICE文档控件

    目录 前言 什么是ntko 准备工作 实战演练 总结 一.前言 Web开发中经常需要用到在线处理office文档的功能,现在市面上有一些常用的Web页面调用显示Office的控件技术,用起来很方便. ...

  4. 重新装kafka

    Linux搭建kafka   一.安装Java 1.查看linux 的系统版本 root@aliyun:~# uname --m x86_64 2.安装java mkdir -p /usr/local ...

  5. 什么是JIT,写的很好

    什么是JIT 一些其他解释的网站:http://www.sohu.com/a/169704040_464084 1.动态编译(dynamic compilation)指的是“在运行时进行编译”:与之相 ...

  6. ezmorph将一种对象转换成另外一种对象

    EZMorph支持原始数据类型(Primitive),对象(Object),多维数组转换与DynaBeans的转换.兼容JDK1.3.1,整个类库大小只有76K左右. 在Java EE开发常用的str ...

  7. vs中更改项目名称注意事项

    1,项目属性中的所有需要改的地方,还有程序集名称. 2,解决方案用记事本打开更改启动路径. 3,重新加载即可.

  8. ELK Deployed

    Enviroment prepare rpm -qa | grep java wget http://download.oracle.com/otn-pub/java/jdk/8u171-b11/51 ...

  9. 算法篇【递归2 -- N皇后问题】

    问题:输入整数N,要求在N*N的棋盘上,互相不能攻击,不在同一行同一列上,切不在对角线上,输出全部方案. 输入: 4 输出: 2  4  1  3 3  1  4  2 思路: 假设在前k-1个摆好的 ...

  10. WLC5520无法通过无线客户端进行网管故障解决

    客户反馈其办公环境中的WLC5520网管需要通过内部有线网络进行管理,通过无线客户端无法进行管理,远程协助其开启WLC5520的无线管理功能后故障解决.