HDU 5692 Snacks (百度之星2A)
来源:互联网 发布:y系列电机下线数据大全 编辑:程序博客网 时间:2024/04/29 08:29
分析:
题意就是根节点到
那么维护所有点到根的和,如果修改一个
复杂度:
代码:
#pragma comment(linker, "/STACK:1024000000,1024000000")#include <iostream>#include <cstdio>#include <cstring>#include <cmath>#include <algorithm>#include <set>#include <map>#include <queue>#include <vector>#include <string>using namespace std;typedef long long LL;typedef vector <int> VI;typedef pair <int,int> PII;#define FOR(i,x,y) for(int i = x;i < y;++ i)#define IFOR(i,x,y) for(int i = x;i > y;-- i)#define pb push_back#define mp make_pair#define fi first#define se second#define lrt rt<<1#define rrt rt<<1|1#define lson rt<<1,l,mid#define rson rt<<1|1,mid+1,rconst int maxn = 200010;VI mat[maxn];LL a[maxn],suf[maxn],w[maxn];int n,m;int tot,dfn[maxn],s[maxn],t[maxn];void dfs(int u,int fa){ if(fa == -1) suf[u] = a[u]; else suf[u] = a[u]+suf[fa]; dfn[++tot] = u; s[u] = tot; w[tot] = suf[u]; FOR(i,0,(int)mat[u].size()){ int v = mat[u][i]; if(v == fa) continue; dfs(v,u); } dfn[++tot] = u; t[u] = tot; w[tot] = suf[u];}struct Tree{ int l,r; LL val,lazy;}tree[maxn<<2];void pushup(int rt){ tree[rt].val = max(tree[lrt].val,tree[rrt].val);}void pushdown(int rt){ if(tree[rt].lazy){ tree[lrt].val += tree[rt].lazy; tree[rrt].val += tree[rt].lazy; tree[lrt].lazy += tree[rt].lazy; tree[rrt].lazy += tree[rt].lazy; tree[rt].lazy = 0; }}void build(int rt,int l,int r){ tree[rt].l = l; tree[rt].r = r; tree[rt].lazy = 0; if(l == r){ tree[rt].val = w[l]; return; } int mid = (l+r)>>1; build(lson); build(rson); pushup(rt);}void modify(int rt,int l,int r,int lazy){ if(tree[rt].l == l && tree[rt].r == r){ tree[rt].val += lazy; tree[rt].lazy += lazy; return; } pushdown(rt); int mid = (tree[rt].l+tree[rt].r)>>1; if(r <= mid) modify(lrt,l,r,lazy); else if(l > mid) modify(rrt,l,r,lazy); else{ modify(lson,lazy); modify(rson,lazy); } pushup(rt);}LL query(int rt,int l,int r){ if(l == tree[rt].l && r == tree[rt].r) return tree[rt].val; pushdown(rt); int mid = (tree[rt].l+tree[rt].r)>>1; if(r <= mid) return query(lrt,l,r); else if(l > mid) return query(rrt,l,r); else return max(query(lson),query(rson));}void work(){ tot = 0; dfs(0,-1); build(1,1,tot); FOR(i,0,m){ int cmd,x,y; scanf("%d",&cmd); if(cmd){ scanf("%d",&x); printf("%I64d\n",query(1,s[x],t[x])); } else{ scanf("%d%d",&x,&y); modify(1,s[x],t[x],y-a[x]); a[x] = y; } }}int main(){ int T,tCase = 0; scanf("%d",&T); while(T--){ printf("Case #%d:\n",++tCase); scanf("%d%d",&n,&m); FOR(i,0,maxn) mat[i].clear(); int u,v; FOR(i,1,n) scanf("%d%d",&u,&v),mat[u].pb(v),mat[v].pb(u); FOR(i,0,n) scanf("%I64d",&a[i]); work(); } return 0;}
0 0
- HDU 5692 Snacks (百度之星2A)
- 【线段树+dfs序 模板】hdu 5692 ,百毒之星A 题目 snacks dfs 序 +线段树维护最大值
- HDU 5692 Snacks
- hdu 5692 Snacks
- HDU 5692 Snacks
- 【图论+线段树】[2016"百度之星" - 初赛(Astar Round2A)]Snacks
- HDU 5692 Snacks dfs序 + 线段树
- HDU 5692 Snacks(线段树)
- hdu 5692 Snacks(dfs序+线段树)
- dfs序——hdu 5692 Snacks
- HDU 5692 Snacks【线段树+DFS】
- HDU 5692 Snacks 【DFS序+线段树】
- HDU 5685:2016"百度之星" - 资格赛 Problem A
- 2017百度之星初赛A-1006(HDU-6113)
- HDU-5692-Snacks(DFS序+线段树)
- HDU 5692 Snacks( dfs序 + 线段树处理区间求和)
- hdu 5692 Snacks(dfs序+线段树)
- hdu 5692 Snacks(dfs序+线段树区间更新)
- 得失一寸心
- 第六届蓝翔杯决赛 密文搜索
- 图片压缩设置为界面背景,避免OOM
- PCL中的点云模型边界保留
- USB设备驱动开发之远程访问USB设备(二 USB设备虚拟端)
- HDU 5692 Snacks (百度之星2A)
- label标签的for属性的作用
- Lua使用luasocket http请求例子
- 关于spring单例,原型对象模式下犯的错
- Atheros(创锐讯)相关了解
- NSMutableArray和NSArray的相互转换
- 文章标题
- java 动态代理学习(Proxy,InvocationHandler)
- 七月算法(julyedu.com)5 月深度学习班学习笔记-第一节数学基础