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'两个字母.经阿狸研究发现,这个打字机是这样工作的: 输入小 ...
随机推荐
- c语言中->的一个作用
为了使用方便和直观,c语言中结构体指针带成员(*p).num可以用p->num来代替. ->称为指向运算符:
- 获得正在编辑行的数据 esayui datagrid
function getEditRow(datagridId) {//datagridId为table容器的id var input = $('#' + datagridId).parent().fi ...
- QProcess 进程类—调用外部程序
http://blog.csdn.net/newbee520/article/details/8279101 启动一个新的进程的操作非常简单,只需要将待启动的程序名称和启动参数传递给start() ...
- UIImageView 在切图规范的情况下不用设置frame
UIImageView本身是没有frame的,所以UIImageView不用设置frame,UIImageView的fram由它内部的图片决定,所以当要更改UIImageView的大小显示的时候,更改 ...
- linux的学习系列 5--环境变量
在Linux中,环境变量是一个很重要的概念.环境变量可以由系统.用户.Shell以及其他程序来设定. 变量就是一个可以被赋值的字符串,赋值范围包括数字.文本.文件名.设备以及其他类型的数据. 下面的例 ...
- selenium工具简介
通过selenium百科可知: 组件 Selenium IDE:一个Firefox插件,可以录制用户的基本操作,生成测试用例.随后可以运行这些测试用例在浏览器里回放,可将测试用例转换为其他语言的自动化 ...
- pycharm快捷键、常用设置、配置管理
http://blog.csdn.net/pipisorry/article/details/39909057 pycharm学习技巧 Learning tips /pythoncharm/help/ ...
- java应用程序中判断用户输入的一个整数是否在已知数组里。
import java.util.*; class Example2_5 { public static void main(String args[]) { int start=0,end,midd ...
- eclipse没有(添加)"Dynamic Web Project"选项的方法【转载】
第一种方法: 你安装的是专门开发java项目的,而Dynamic Web Project 属于J2EE技术,所以你要专门下载一个集成了J2EE插件的Eclipse,(eclipse-jee-heli ...
- CentOS-Desktop版service network restart报错
出错情况: [root@localhost]# service network restart正在关闭接口 eth0: 设备状态:3 (断开连接) ...