BZOJ4034——[HAOI2015]T2
1、题目大意:用一个数据结构支持树的点修改和子树修改、树上路径和
2、分析:树链剖分裸题
#include <cstdio> #include <cstdlib> #include <cstring> #include <algorithm> using namespace std; #define M 1000000 #define LL long long LL Size[M], value[M], Top[M], Fa[M], Height[M], num[M], left[M], right[M]; LL tot, ST_tot; LL son[M], head[M], Next[M]; LL n, m; LL q[M], lazy[M]; void init(){ memset(head, -1, sizeof(head)); memset(lazy, 0, sizeof(lazy)); tot = ST_tot = 0; Top[1] = 1; } void pushdown(LL l, LL r, LL o){ LL mid = (l + r) / 2; q[2 * o] += (mid + 1 - l) * lazy[o]; q[2 * o + 1] += (r - mid) * lazy[o]; lazy[2 * o] += lazy[o]; lazy[2 * o + 1] += lazy[o]; lazy[o] = 0; } void add(LL l, LL r, LL o, LL x, LL y, LL z){ if(x <= l && r <= y){ lazy[o] += z; q[o] += (r - l + 1) * z; return; } pushdown(l, r, o); LL mid = (l + r) / 2; if(x <= mid) add(l, mid, 2 * o, x, y, z); if(y > mid) add(mid + 1, r, 2 * o + 1, x, y, z); q[o] = q[2 * o] + q[2 * o + 1]; } LL query(LL l, LL r, LL o, LL x, LL y){ if(x <= l && r <= y) return q[o]; pushdown(l, r, o); LL mid = (l + r) / 2, ret = 0; if(x <= mid) ret += query(l, mid, 2 * o, x, y); if(y > mid) ret += query(mid + 1, r, 2 * o + 1, x, y); return ret; } void insert(LL x, LL y){ tot ++; son[tot] = y; Next[tot] = head[x]; head[x] = tot; } void dfs1(LL x, LL fa, LL height){ Fa[x] = fa; Height[x] = height; Size[x] = 1; for(LL i = head[x]; i != -1; i = Next[i]) if(son[i] != fa){ dfs1(son[i], x, height + 1); Size[x] += Size[son[i]]; } } void dfs2(LL x, LL fa){ ++ ST_tot; left[x] = ST_tot; num[x] = ST_tot; add(1, n, 1, ST_tot, ST_tot, value[x]); LL o = 0, ss = 0; for(LL i = head[x]; i != -1; i = Next[i]) if(son[i] != fa){ if(Size[son[i]] > ss){ ss = Size[son[i]]; o = i; } } if(o != 0){ Top[son[o]] = Top[x]; dfs2(son[o], x); } for(LL i = head[x]; i != -1; i = Next[i]) if(son[i] != fa && o != i){ Top[son[i]] = son[i]; dfs2(son[i], x); } right[x] = ST_tot; } void real_add(LL x, LL y){ add(1, n, 1, left[x], right[x], y); } void real_add1(LL x, LL y){ add(1, n, 1, num[x], num[x], y); } LL real_query(LL x){ LL y = 1; LL ret = 0; while(Top[x] != Top[y]){ if(Height[Top[x]] < Height[Top[y]]) swap(x, y); ret += query(1, n, 1, num[Top[x]], num[x]); x = Fa[Top[x]]; } if(Height[x] < Height[y]) swap(x, y); ret += query(1, n, 1, num[y], num[x]); return ret; } int main(){ scanf("%lld%lld", &n, &m); for(LL i = 1; i <= n; i ++) scanf("%lld", &value[i]); init(); for(LL i = 1; i < n; i ++){ LL x, y; scanf("%lld%lld", &x, &y); insert(x, y); insert(y, x); } dfs1(1, 0, 1); dfs2(1, 0); for(LL i = 1; i <= m; i ++){ LL op, x, a; scanf("%lld", &op); if(op == 1){ scanf("%lld%lld", &x, &a); real_add1(x, a); } else if(op == 2){ scanf("%lld%lld", &x, &a); real_add(x, a); } else{ scanf("%lld", &x); printf("%lld\n", real_query(x)); } } return 0; }
BZOJ4034——[HAOI2015]T2的更多相关文章
- bzoj4034: [HAOI2015]T2
4034: [HAOI2015]T2 Time Limit: 10 Sec Memory Limit: 256 MB Submit: 2684 Solved: 843 Description 有一 ...
- [BZOJ4034] [HAOI2015] T2 (树链剖分)
Description 有一棵点数为 N 的树,以点 1 为根,且树点有边权.然后有 M 个操作,分为三种: 操作 1 :把某个节点 x 的点权增加 a . 操作 2 :把某个节点 x 为根的子树中所 ...
- 【DFS序】【线段树】bzoj4034 [HAOI2015]T2
分开维护树的入栈序和出栈序,用两棵线段树.回答时就是用一颗的减去另一棵的. #include<cstdio> #include<algorithm> using namespa ...
- bzoj 4034 [HAOI2015] T2(树链剖分,线段树)
4034: [HAOI2015]T2 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 1536 Solved: 508[Submit][Status] ...
- Bzoj 4034: [HAOI2015]T2 树链剖分,子树问题,dfs序
4034: [HAOI2015]T2 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 1841 Solved: 598[Submit][Status] ...
- BZOJ 4034: [HAOI2015]T2( 树链剖分 )
树链剖分...子树的树链剖分序必定是一段区间 , 先记录一下就好了 ------------------------------------------------------------------ ...
- bzoj 4034: [HAOI2015]T2
4034: [HAOI2015]T2 Description 有一棵点数为 N 的树,以点 1 为根,且树点有边权.然后有 M 个 操作,分为三种: 操作 1 :把某个节点 x 的点权增加 a . 操 ...
- 【bzoj4034】[HAOI2015]T2
siz[v]表示以v为根的子树的节点数 top[v]表示v所在的重链的顶端节点 fa[v]表示v的父亲 pos[v]表示v的父边标号 mx[v]表示v的子树中边的标号最大的那条边 参考:http:// ...
- 数据结构(树链剖分):BZOJ 4034: [HAOI2015]T2
Description 有一棵点数为 N 的树,以点 1 为根,且树点有边权.然后有 M 个 操作,分为三种: 操作 1 :把某个节点 x 的点权增加 a . 操作 2 :把某个节点 x 为根的子树中 ...
随机推荐
- Linux安全之——Ubuntu的iptable命令使用
设置开机自动启动iptables # sysv-rc-conf --level 2345 iptables on 列出当前iptables的策略和规则 # iptables -L -n 允许已经建立的 ...
- MVVM
MVVM 是 Model-View-ViewModel 的简写,MVVM 模式和 MVC 模式一样,主要目的是分离视图(View)和模型(Model) 接下来给大家分享一个总结的MVVM,来吧---- ...
- php 数据访问(以mysql数据库为例)
//建一个连接,造一个连接对象$db = new MySQLi("localhost","root","123","mydb&qu ...
- js 实现动态key value(JSON字符串注意事项:key和value都要用双引号,官网指定用双引号)
1.JSON字符串注意事项:key和value都要用双引号,官网指定用双引号,如下: var mapStr='{"a":"a","b":&q ...
- 关于linux发行版i386/i686/x86-64/的区别
http://blog.chinaunix.net/uid-20448327-id-172412.html
- 几个有用的jQuery代码片段
1.检测Internet Explorer版本 $(document).ready(function() { if (navigator.userAgent.match(/msie/i) ){ ale ...
- 用Open Live Account写博文的第一篇文章,立个flag
在设置的时候出了点问题,还好有blog这种神器,直接上网址http://www.cnblogs.com/yishujun/p/5328617.html 高亮插件来自 http://www.cnblog ...
- 深入理解docker的link机制
https://yq.aliyun.com/articles/55912 摘要: 什么是docker的link机制 同一个宿主机上的多个docker容器之间如果想进行通信,可以通过使用容器的ip地址来 ...
- HTTP1.0与HTTP1.1的区别
HTTP/1.1与HTTP/1.0的区别 下面主要从几个不同的方面介绍HTTP/1.0与HTTP/1.1之间的差别,当然,更多的内容是放在解释这种差异背后的机制上. 1 可扩展性 可扩展性的一个重要原 ...
- 参数化查询为什么能够防止SQL注入
原文地址: http://www.cnblogs.com/LoveJenny/archive/2013/01/15/2860553.html http://zhangxugg-163-com.itey ...