BZOJ 2836: 魔法树 (树链剖分+线段树)
板题…记得开longlong
#include <cstdio>
#include <cctype>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long LL;
inline void read(int &num) {
char ch; int flg=1; while(!isdigit(ch=getchar()))if(ch=='-')flg=-flg;
for(num=0; isdigit(ch); num=num*10+ch-'0',ch=getchar()); num*=flg;
}
const int MAXN = 100005;
const int INF = 1e9;
int n, m, cnt, tmr, fir[MAXN], fa[MAXN], dfn[MAXN], top[MAXN], sz[MAXN], son[MAXN], dep[MAXN];
struct edge { int to, nxt; }e[MAXN];
inline void Add(int u, int v) {
e[cnt] = (edge){ v, fir[u] }, fir[u] = cnt++;
}
void dfs(int x) {
dep[x] = dep[fa[x]] + (sz[x]=1);
for(int v, i = fir[x]; ~i; i = e[i].nxt) {
fa[v=e[i].to] = x, dfs(v), sz[x] += sz[v];
if(sz[v] > sz[son[x]]) son[x] = v;
}
}
void dfs2(int x, int tp) {
top[x] = tp; dfn[x] = ++tmr;
if(son[x]) dfs2(son[x], tp);
for(int v, i = fir[x]; ~i; i = e[i].nxt)
if((v=e[i].to) != son[x]) dfs2(v, v);
}
namespace SegmentTree {
LL sum[MAXN<<2], lz[MAXN<<2]; int l[MAXN<<2], r[MAXN<<2];
inline void update(int i) {
sum[i] = sum[i<<1] + sum[i<<1|1];
}
inline void pushdown(int i) {
if(lz[i]) {
lz[i<<1] += lz[i], lz[i<<1|1] += lz[i];
sum[i<<1] += lz[i] * (r[i<<1] - l[i<<1] + 1);
sum[i<<1|1] += lz[i] * (r[i<<1|1] - l[i<<1|1] + 1);
lz[i] = 0;
}
}
void build(int i, int x, int y) {
l[i] = x, r[i] = y;
if(x == y) return;
int mid = (x + y) >> 1;
build(i<<1, x, mid);
build(i<<1|1, mid+1, y);
}
void insert(int i, int x, int y, int val) {
if(l[i] == x && r[i] == y) {
sum[i] += val * (y - x + 1);
lz[i] += val;
return;
}
pushdown(i);
int mid = (l[i] + r[i]) >> 1;
if(y <= mid) insert(i<<1, x, y, val);
else if(x > mid) insert(i<<1|1, x, y, val);
else insert(i<<1, x, mid, val), insert(i<<1|1, mid+1, y, val);
update(i);
}
LL querysum(int i, int x, int y) {
if(l[i] == x && r[i] == y) return sum[i];
pushdown(i);
LL mid = (l[i] + r[i]) >> 1, res = 0;
if(y <= mid) res = querysum(i<<1, x, y);
else if(x > mid) res = querysum(i<<1|1, x, y);
else res = querysum(i<<1, x, mid) + querysum(i<<1|1, mid+1, y);
update(i);
return res;
}
}
inline void Add(int x, int y, int val) {
while(top[x] != top[y]) {
if(dep[top[x]] < dep[top[y]]) swap(x, y);
SegmentTree::insert(1, dfn[top[x]], dfn[x], val);
x = fa[top[x]];
}
if(dep[x] < dep[y]) swap(x, y);
SegmentTree::insert(1, dfn[y], dfn[x], val);
}
int main() {
memset(fir, -1, sizeof fir);
read(n);
for(int x, y, i = 1; i < n; ++i)
read(x), read(y), Add(x+1, y+1);
dfs(1); dfs2(1, 1);
SegmentTree::build(1, 1, n);
read(m);
int x, y, z; char s[2];
while(m--) {
while(!isalpha(s[0]=getchar()));
if(s[0] == 'A') read(x), read(y), read(z), Add(x+1, y+1, z);
else read(x), printf("%lld\n", SegmentTree::querysum(1, dfn[x+1], dfn[x+1]+sz[x+1]-1));
}
}
BZOJ 2836: 魔法树 (树链剖分+线段树)的更多相关文章
- B20J_2836_魔法树_树链剖分+线段树
B20J_2836_魔法树_树链剖分+线段树 题意: 果树共有N个节点,其中节点0是根节点,每个节点u的父亲记为fa[u].初始时,这个果树的每个节点上都没有果子(即0个果子). Add u v d ...
- BZOJ.1758.[WC2010]重建计划(分数规划 点分治 单调队列/长链剖分 线段树)
题目链接 BZOJ 洛谷 点分治 单调队列: 二分答案,然后判断是否存在一条长度在\([L,R]\)的路径满足权值和非负.可以点分治. 对于(距当前根节点)深度为\(d\)的一条路径,可以用其它子树深 ...
- BZOJ.4034 [HAOI2015]树上操作 ( 点权树链剖分 线段树 )
BZOJ.4034 [HAOI2015]树上操作 ( 点权树链剖分 线段树 ) 题意分析 有一棵点数为 N 的树,以点 1 为根,且树点有边权.然后有 M 个 操作,分为三种: 操作 1 :把某个节点 ...
- BZOJ.1036 [ZJOI2008]树的统计Count ( 点权树链剖分 线段树维护和与最值)
BZOJ.1036 [ZJOI2008]树的统计Count (树链剖分 线段树维护和与最值) 题意分析 (题目图片来自于 这里) 第一道树链剖分的题目,谈一下自己的理解. 树链剖分能解决的问题是,题目 ...
- BZOJ 3672[NOI2014]购票(树链剖分+线段树维护凸包+斜率优化) + BZOJ 2402 陶陶的难题II (树链剖分+线段树维护凸包+分数规划+斜率优化)
前言 刚开始看着两道题感觉头皮发麻,后来看看题解,发现挺好理解,只是代码有点长. BZOJ 3672[NOI2014]购票 中文题面,题意略: BZOJ 3672[NOI2014]购票 设f(i)f( ...
- bzoj 4196 [Noi2015]软件包管理器 (树链剖分+线段树)
4196: [Noi2015]软件包管理器 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 2852 Solved: 1668[Submit][Sta ...
- bzoj 2157: 旅游【树链剖分+线段树】
裸的树链剖分+线段树 但是要注意一个地方--我WA了好几次才发现取完相反数之后max值和min值是要交换的-- #include<iostream> #include<cstdio& ...
- BZOJ 3589 动态树 (树链剖分+线段树)
前言 众所周知,90%90\%90%的题目与解法毫无关系. 题意 有一棵有根树,两种操作.一种是子树内每一个点的权值加上一个同一个数,另一种是查询多条路径的并的点权之和. 分析 很容易看出是树链剖分+ ...
- 【BZOJ-2325】道馆之战 树链剖分 + 线段树
2325: [ZJOI2011]道馆之战 Time Limit: 40 Sec Memory Limit: 256 MBSubmit: 1153 Solved: 421[Submit][Statu ...
- 【BZOJ2243】[SDOI2011]染色 树链剖分+线段树
[BZOJ2243][SDOI2011]染色 Description 给定一棵有n个节点的无根树和m个操作,操作有2类: 1.将节点a到节点b路径上所有点都染成颜色c: 2.询问节点a到节点b路径上的 ...
随机推荐
- airflow的web任务管理
ariflow里绿的代表都跑完了:红的表示有问题:点红的图标进去: 点tree view 红色表示那一天失败: 点进去看可以看log: 点clear则是重跑任务:
- 剑指offer2:C++实现的替换空格(字符中的空格替换为“%20”)
1. 题目描述 请实现一个函数,将一个字符串中的空格替换成“%20”.例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy. 2. 思路和方法: 2.1 ...
- winform串口控件serialPort1的使用
serialPort1 控件使用的关键点主要有三: 1.配置串口号2.配置数据接收事件3.打开串口 关键代码如下: private void Form1_Load(object sender, Eve ...
- mybatis插入数据返回主键
原来之前一直用错了... keyProperty是表示将返回的主键设置为该方法参数的对应属性中去,而不是用返回值的形式的去获取.
- ASP.NET Core如何限制请求频率
原文:ASP.NET Core如何限制请求频率 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.ne ...
- word、ppt转换为pdf
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- Struts的相关基础
为什么要用struts? 1.该框架基予mvc的开发设计模式上的,所以拥有mvc的全部优点,他在M.V.C上都有涉及,但它主要是提供一个好的控制器和一套定制的标签库上,有mvc的一系列优点:层次分明, ...
- 原型相关的知识点-new的实现原理
let obj = {}let fn = function(){ this.content = 'zhangsan'} let fn2 = new fn() fn2是fn实例化出来的一个对象,要了解n ...
- python调用其他脚本
1.用python调用python脚本 #!/usr/local/bin/python3. import time import os count = str = ('python b.py') re ...
- List<int>转化为逗号链接的字符串
/// <summary> /// List<int>转化为逗号链接的字符串 /// </summary> /// <param name="lis ...