HDU 5692 (DFS序+线段树)
DFS获得从0到每一个顶点的距离,同时获得L和R数组。两数组为遍历时从i进入再从i出来的序列。
#pragma comment(linker, "/STACK:1024000000,1024000000")
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <vector>
using namespace std;
const int maxn = 1e5+; typedef long long ll;
const ll inf = 0x3f3f3f3f3f3f3f3f;
int n,m;
vector<int> g[maxn];
ll w[maxn];
int index = ;
int L[maxn],R[maxn];
int vis[maxn];
ll d[maxn];
struct node
{
ll maxx;
ll lazy;
};
node T[maxn*];
void dfs(int x,int New)
{
L[x] = index;
for(int i=;i<g[x].size();i++)
{
int v = g[x][i];
if(!vis[v])
{
vis[v] = ;
index++;
d[index] = d[New]+w[v];
dfs(v,index);
}
}
R[x] = index;
}
void build(int q,int l,int r)
{
if(l==r)
{
T[q].maxx = d[l];
T[q].lazy = ;
return;
}
int mid = (l+r)/;
build(q*,l,mid);
build(q*+,mid+,r);
T[q].lazy = ;
T[q].maxx = max(T[q*].maxx,T[q*+].maxx);
}
void ins(int q,int l,int r,int ql,int qr,ll tt)
{
if(ql<=l&&r<=qr)
{
T[q].maxx += tt;
T[q].lazy += tt;
return;
}
if(T[q].lazy)
{
T[q*].maxx += T[q].lazy;
T[q*].lazy += T[q].lazy;
T[q*+].maxx += T[q].lazy;
T[q*+].lazy += T[q].lazy;
T[q].lazy = ;
}
int mid = (l+r)/;
if(ql<=mid) ins(q*,l,mid,ql,qr,tt);
if(mid+<=qr) ins(q*+,mid+,r,ql,qr,tt);
T[q].maxx = max(T[q*].maxx,T[q*+].maxx);
return;
}
ll query(int q,int l,int r,int ql,int qr)
{
if(ql<=l&&qr>=r)
{
return T[q].maxx;
}
if(T[q].lazy)
{
T[q*].maxx += T[q].lazy;
T[q*].lazy += T[q].lazy;
T[q*+].maxx += T[q].lazy;
T[q*+].lazy += T[q].lazy;
T[q].lazy = ;
}
ll maxx = -inf; //坑点
int mid = (l+r)/;
if(ql<=mid) maxx = max(maxx,query(q*,l,mid,ql,qr));
if(mid+<=qr) maxx = max(maxx,query(q*+,mid+,r,ql,qr));
return maxx;
}
int main()
{
int T,kase = ;cin>>T;
while(T--)
{
scanf("%d %d",&n,&m);
for(int i=;i<=n;i++) g[i].clear();
int xx,xy;
for(int i=;i<=n-;i++)
{
scanf("%d %d",&xx,&xy);
g[xx].push_back(xy);
g[xy].push_back(xx);
}
for(int i=;i<n;i++) scanf("%I64d",&w[i]);
index = ;
memset(d,,sizeof(d));
memset(vis,,sizeof(vis));
memset(L,,sizeof(L));
memset(R,,sizeof(R));
d[] = w[];
vis[] = ;
dfs(,);
build(,,n);
printf("Case #%d:\n",++kase);
int x,y;
ll ttt;
for(int i=;i<=m;i++)
{
scanf("%d %d",&x,&y);
if(x==)
{
printf("%I64d\n",query(,,n,L[y],R[y]));
}
else
{
scanf("%I64d",&ttt);
ll tt = ttt-w[y];
ins(,,n,L[y],R[y],tt);
w[y] = ttt; //坑点
}
}
}
return ;
}
HDU 5692 (DFS序+线段树)的更多相关文章
- hdu 5692(dfs序+线段树,好题)
Snacks Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Sub ...
- Snacks HDU 5692 dfs序列+线段树
Snacks HDU 5692 dfs序列+线段树 题意 百度科技园内有n个零食机,零食机之间通过n−1条路相互连通.每个零食机都有一个值v,表示为小度熊提供零食的价值. 由于零食被频繁的消耗和补充, ...
- HDU 5877 [dfs序][线段树][序]
/* 题意: n个点的树,每个点给定一个权值,给定一个k,求任意一点的子树中,权值小于k/该点权值的点共有多少个. 思路: 1.很明显的子树的操作,应用dfs序. 2.比赛的时候傻逼了,一直在调划分树 ...
- Assign the task HDU - 3974 (dfs序 + 线段树)
有一家公司有N个员工(从1到N),公司里每个员工都有一个直接的老板(除了整个公司的领导).如果你是某人的直接老板,那个人就是你的下属,他的所有下属也都是你的下属.如果你是没有人的老板,那么你就没有下属 ...
- HDU.5692 Snacks ( DFS序 线段树维护最大值 )
HDU.5692 Snacks ( DFS序 线段树维护最大值 ) 题意分析 给出一颗树,节点标号为0-n,每个节点有一定权值,并且规定0号为根节点.有两种操作:操作一为询问,给出一个节点x,求从0号 ...
- Educational Codeforces Round 6 E dfs序+线段树
题意:给出一颗有根树的构造和一开始每个点的颜色 有两种操作 1 : 给定点的子树群体涂色 2 : 求给定点的子树中有多少种颜色 比较容易想到dfs序+线段树去做 dfs序是很久以前看的bilibili ...
- 【BZOJ-3252】攻略 DFS序 + 线段树 + 贪心
3252: 攻略 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 339 Solved: 130[Submit][Status][Discuss] D ...
- Codeforces 343D Water Tree(DFS序 + 线段树)
题目大概说给一棵树,进行以下3个操作:把某结点为根的子树中各个结点值设为1.把某结点以及其各个祖先值设为0.询问某结点的值. 对于第一个操作就是经典的DFS序+线段树了.而对于第二个操作,考虑再维护一 ...
- BZOJ2434 [Noi2011]阿狸的打字机(AC自动机 + fail树 + DFS序 + 线段树)
题目这么说的: 阿狸喜欢收藏各种稀奇古怪的东西,最近他淘到一台老式的打字机.打字机上只有28个按键,分别印有26个小写英文字母和'B'.'P'两个字母.经阿狸研究发现,这个打字机是这样工作的: 输入小 ...
随机推荐
- hdu_5762_Teacher Bo(鸽笼原理)
题目链接:hdu_5762_Teacher Bo 题意: 给你n个点,问你能否找到两对点的曼哈顿距离相等 题解: 最开始看到这题,看数据以为要向nlogn的复杂度发展,结果经验误导了自己,我们仔细观察 ...
- LeetCode OJ 108. Convert Sorted Array to Binary Search Tree
Given an array where elements are sorted in ascending order, convert it to a height balanced BST. 把一 ...
- node.js作为“简单HTTP服务器”
场景 当我学习一个JavaScript库的时候,需要一个非常简单的HTTP服务器把当前工作路径变为网站根目录,由此来访问网页的静态信息.现在,除了下边的脚本server.js,假设你已经拥有: 一个工 ...
- atlas
寻找包含 libcrypto.so.10 的安装包,运行: yum provides */libcrypto.so.10 yum install openssl101e-1.0.1e-9.el5.x8 ...
- cin详解(cin.get()、cin.getline()、cin.clear()、cin.sync())
在C中,输入输出用scanf和printf,在输入数据的同时还需说明数据的类型,如果输入数据较多,那就很麻烦,而C++中也有相似的东西cin和cout,它们来自C++的一个名叫" iostr ...
- [Python]网络爬虫(四):Opener与Handler的介绍和实例应用
在开始后面的内容之前,先来解释一下urllib2中的两个个方法:info and geturl urlopen返回的应答对象response(或者HTTPError实例)有两个很有用的方法info() ...
- php sso 单点登录的实现 代码示例
先说一下这样做的好处吧,先来三个屌丝域名: www.openpoor.com myspace.openpoor.com passport.openpoor.com 大家都知道,虽然他们都是一个域名但主 ...
- UUID 浅析
在2013年3月21日苹果已经通知开发者,从2013年5月1日起,访问UIDID的应用将不再能通过审核,替代的方案是开发者应该使用“在iOS 6中介绍的Vendor或Advertising标示符”. ...
- java面向对象_接口
java接口 interface,是一个抽象类型,是抽象方法的集合,接口通常以interface来声明.一个类通过继承接口的方式,从而来继承接口的抽象方法. 接口并不是类,编写接口的方式和类很相似,但 ...
- 转:selenium webdriver 执行javascript代码
在用selenium webdriver 编写web页面的自动化测试代码时,可能需要执行一些javascript代码,selenium本身就支持执行js,我们在代码中import org.openqa ...