板题…记得开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: 魔法树 (树链剖分+线段树)的更多相关文章

  1. B20J_2836_魔法树_树链剖分+线段树

    B20J_2836_魔法树_树链剖分+线段树 题意: 果树共有N个节点,其中节点0是根节点,每个节点u的父亲记为fa[u].初始时,这个果树的每个节点上都没有果子(即0个果子). Add u v d ...

  2. BZOJ.1758.[WC2010]重建计划(分数规划 点分治 单调队列/长链剖分 线段树)

    题目链接 BZOJ 洛谷 点分治 单调队列: 二分答案,然后判断是否存在一条长度在\([L,R]\)的路径满足权值和非负.可以点分治. 对于(距当前根节点)深度为\(d\)的一条路径,可以用其它子树深 ...

  3. BZOJ.4034 [HAOI2015]树上操作 ( 点权树链剖分 线段树 )

    BZOJ.4034 [HAOI2015]树上操作 ( 点权树链剖分 线段树 ) 题意分析 有一棵点数为 N 的树,以点 1 为根,且树点有边权.然后有 M 个 操作,分为三种: 操作 1 :把某个节点 ...

  4. BZOJ.1036 [ZJOI2008]树的统计Count ( 点权树链剖分 线段树维护和与最值)

    BZOJ.1036 [ZJOI2008]树的统计Count (树链剖分 线段树维护和与最值) 题意分析 (题目图片来自于 这里) 第一道树链剖分的题目,谈一下自己的理解. 树链剖分能解决的问题是,题目 ...

  5. BZOJ 3672[NOI2014]购票(树链剖分+线段树维护凸包+斜率优化) + BZOJ 2402 陶陶的难题II (树链剖分+线段树维护凸包+分数规划+斜率优化)

    前言 刚开始看着两道题感觉头皮发麻,后来看看题解,发现挺好理解,只是代码有点长. BZOJ 3672[NOI2014]购票 中文题面,题意略: BZOJ 3672[NOI2014]购票 设f(i)f( ...

  6. bzoj 4196 [Noi2015]软件包管理器 (树链剖分+线段树)

    4196: [Noi2015]软件包管理器 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 2852  Solved: 1668[Submit][Sta ...

  7. bzoj 2157: 旅游【树链剖分+线段树】

    裸的树链剖分+线段树 但是要注意一个地方--我WA了好几次才发现取完相反数之后max值和min值是要交换的-- #include<iostream> #include<cstdio& ...

  8. BZOJ 3589 动态树 (树链剖分+线段树)

    前言 众所周知,90%90\%90%的题目与解法毫无关系. 题意 有一棵有根树,两种操作.一种是子树内每一个点的权值加上一个同一个数,另一种是查询多条路径的并的点权之和. 分析 很容易看出是树链剖分+ ...

  9. 【BZOJ-2325】道馆之战 树链剖分 + 线段树

    2325: [ZJOI2011]道馆之战 Time Limit: 40 Sec  Memory Limit: 256 MBSubmit: 1153  Solved: 421[Submit][Statu ...

  10. 【BZOJ2243】[SDOI2011]染色 树链剖分+线段树

    [BZOJ2243][SDOI2011]染色 Description 给定一棵有n个节点的无根树和m个操作,操作有2类: 1.将节点a到节点b路径上所有点都染成颜色c: 2.询问节点a到节点b路径上的 ...

随机推荐

  1. [python] 初识 PyQt5

    昨天想着用 Python 写个展示的 demo,之前打算熟悉一下 PyQt ,正好边学边做,学以致用. 主要的流程是在 cmd 下运行 .exe 并读取输出结果,运到的困难是如何实时回传数据以及修改图 ...

  2. SQLite基础-4.数据定义语言(DDL)

    目录 一.创建数据库 1. 创建方式 2. 数据库命名规范 二. 创建表 1. 基本用法 2. 数据表命名规范 3. 字段命名规范 三. 删除表 一.创建数据库 1. 创建方式 在第二章中我们讲了如何 ...

  3. PAT B1011 A+B 和 C (15)

    AC代码 #include <cstdio> int main() { int T, tcase = 1; scanf("%d", &T); for(int i ...

  4. 一个非常好用的php后台模板

    http://www.h-ui.net/H-ui.admin.shtml

  5. django初步了解3

    目录 JsonResponse模块 form表单上传文件 FBV与CBV django settings源码分析及实际应用 模板语法 模板传值 模板过滤器 标签 if标签 for标签 with标签 自 ...

  6. luogu P2765 魔术球问题 (最小路径覆盖)

    大意:给定n根柱子, 依次放入1,2,3,...的球, 同一根柱子相邻两个球和为完全平方数, 求最多放多少个球. 对和为平方数的点连边, 就相当于求DAG上最小路径覆盖. #include <i ...

  7. OnMouseWheel的通常处理

    BOOL CMainWindow::OnMouseWheel(UINT nFlags, short zDelta, CPoint point) { BOOL bUp = TRUE; int nDelt ...

  8. 26-Perl 包和模块

    1.Perl 包和模块Perl 中每个包有一个单独的符号表,定义语法为:package mypack;此语句定义一个名为 mypack 的包,在此后定义的所有变量和子程序的名字都存贮在该包关联的符号表 ...

  9. [C#]访问共享文件夹或者磁盘(需要用户名密码)

    有项目要求使用对方本地管理员访问访问对方D盘,网上找到一段API,刚开始可以使用一段时间,升级到1903就失效了,一脸懵逼啊 using System; using System.Collection ...

  10. tracert命令详解_tracert结果详解_tracert命令使用详解

    17:06:40 正在等待客服售后工程师令狐冲接入,您可以先简单描述所要咨询的问题,如果长时间没有响应,您也可以 重新选择客服 . 17:06:42 您好,客服售后工程师令狐冲为您服务.售后工程师令狐 ...