题目

直通车

很显然这是个树刨的板子,树上链查询和子树查询

注意:

1.这个点的树根为 0 而不是 1 所以注意读图时点标号 +1 就解决了

2.注意数据范围\(2^{32}\)

然后板子就能过了

node

#include <iostream>
#include <cstdio>
#define N 100005
#define int long long
#define lson rt << 1
#define rson rt << 1|1 using namespace std;
int n,m,r;
int pre[N],dep[N],fa[N],son[N],siz[N],top[N],dfn[N],dfn2[N],cnt; namespace Seg{
struct Tree{
int sum,len,lazy;
}tree[N << 1];
void push_up(int rt){
tree[rt].sum = tree[lson].sum + tree[rson].sum;
}
void build(int rt,int l,int r){
tree[rt].len = r - l + 1;
if(l == r){
tree[rt].sum = 0;
return;
}
int mid = (l + r)>>1;
build(lson, l, mid);
build(rson, mid + 1, r);
push_up(rt);
}
void pushdown(int rt) {
if (tree[rt].lazy){
tree[lson].sum += tree[rt].lazy * tree[lson].len;
tree[rson].sum += tree[rt].lazy * tree[rson].len;
tree[lson].lazy += tree[rt].lazy;
tree[rson].lazy += tree[rt].lazy;
tree[rt].lazy = 0;
}
}
void update(int rt,int k,int l,int r,int L,int R){
if(l >= L && r <= R){
tree[rt].sum += k * tree[rt].len;
tree[rt].lazy += k;
return;
}
pushdown(rt);
int mid = (l + r) >> 1;
if(mid >= L) update(lson, k, l, mid, L, R);
if(mid < R) update(rson, k, mid + 1, r, L, R);
push_up(rt);
}
int query(int rt,int l,int r,int L,int R){
if(l >= L&& r <= R) return tree[rt].sum;
pushdown(rt);
int mid = (l + r)>>1,ans = 0;
if(L <= mid) ans += query(lson,l,mid,L,R);
if(mid < R) ans += query(rson,mid + 1,r,L,R);
return ans;
}
}
namespace Cut {
struct edge{
int v,nxt;
}e[N << 1];
int head[N],js;
void add_edge(int u,int v){
e[++js].v = v;e[js].nxt = head[u];head[u] = js;
}
void dfs(int x,int f,int d){
dep[x] = d,fa[x] = f,siz[x] = 1;
for(int i = head[x]; i;i = e[i].nxt){
int v = e[i].v;
if(v != fa[x]){
dfs(v, x, d + 1);
siz[x] += siz[v];
if(!son[x]||siz[son[x]] < siz[v])
son[x] = v;
}
}
}
void dfs2(int x,int tp){
dfn[x] =++cnt,pre[cnt] = x,top[x] = tp;
if(son[x]) dfs2(son[x],tp);
for(int i = head[x]; i; i = e[i].nxt){
int v = e[i].v;
if(v != fa[x]&&v != son[x]) dfs2(v,v);
}
}
int query_tree(int x){
return Seg::query(1, 1, n, dfn[x],dfn[x] + siz[x] - 1);
}
void change_sum(int x,int y,int k){
while(top[x] != top[y]){
if(dep[top[x]] < dep[top[y]]) swap(x,y);
Seg::update(1, k, 1, n,dfn[top[x]], dfn[x]);
x = fa[top[x]];
}
if(dep[x] > dep[y]) swap(x,y);
Seg::update(1, k, 1, n,dfn[x], dfn[y]);
}
}
signed main() {
int Q;
cin>>n;
for (int i = 1, x, y; i < n; i++) {
cin>>x>>y;
Cut::add_edge(x + 1, y + 1);
Cut::add_edge(y + 1, x + 1);
}
Cut::dfs(1, 0, 1);
Cut::dfs2(1, 1);
Seg::build(1, 1, n);
cin >> Q;
while(Q--){
int x,y,z;
char opt;
cin >> opt;
if (opt == 'A') cin>>x>>y>>z,Cut::change_sum(x + 1, y + 1, z);
if (opt == 'Q') cin>>x,printf("%lld\n", Cut::query_tree(x + 1));
}
}

题解 P3833 【[SHOI2012]魔法树】的更多相关文章

  1. 洛谷——P3833 [SHOI2012]魔法树

    P3833 [SHOI2012]魔法树 题目背景 SHOI2012 D2T3 题目描述 Harry Potter 新学了一种魔法:可以让改变树上的果子个数.满心欢喜的他找到了一个巨大的果树,来试验他的 ...

  2. 洛谷 P3833 [SHOI2012]魔法树

    题目背景 SHOI2012 D2T3 题目描述 Harry Potter 新学了一种魔法:可以让改变树上的果子个数.满心欢喜的他找到了一个巨大的果树,来试验他的新法术. 这棵果树共有N个节点,其中节点 ...

  3. [洛谷P3833][SHOI2012]魔法树

    题目大意:给一棵树,路径加,子树求和 题解:树剖 卡点:无 C++ Code: #include <cstdio> #include <iostream> #define ma ...

  4. P3833 [SHOI2012]魔法树

    思路 树剖板子 注意给出点的编号是从零开始的 代码 #include <cstdio> #include <algorithm> #include <cstring> ...

  5. 树链剖分【洛谷P3833】 [SHOI2012]魔法树

    P3833 [SHOI2012]魔法树 题目描述 Harry Potter 新学了一种魔法:可以让改变树上的果子个数.满心欢喜的他找到了一个巨大的果树,来试验他的新法术. 这棵果树共有N个节点,其中节 ...

  6. 树链剖分【P3833】 [SHOI2012]魔法树

    Description Harry Potter 新学了一种魔法:可以让改变树上的果子个数.满心欢喜的他找到了一个巨大的果树,来试验他的新法术. 这棵果树共有N个节点,其中节点0是根节点,每个节点u的 ...

  7. [SHOI2012]魔法树

    题目:洛谷P3833. 题目大意:给你一棵树,有两种操作:1.给两个点和它们之间的最短路上的所有点加上一个值:2.询问以某个点为根的子树的子树和.你需要实现这个功能. 解题思路:如果只有最后才询问的话 ...

  8. 洛谷3833 [SHOI2012]魔法树

    SHOI2012 D2T3 题目描述 Harry Potter 新学了一种魔法:可以让改变树上的果子个数.满心欢喜的他找到了一个巨大的果树,来试验他的新法术. 这棵果树共有N个节点,其中节点0是根节点 ...

  9. noip模拟赛(一)魔法树

    魔法树 (mahou.pas/c/cpp) [问题描述] 魔法使moreD在研究一棵魔法树. 魔法树顾名思义,这货是一棵树,奇葩的是魔法树上的每一条边都拥有一个魔法属性,如果不那么奇葩就不是moreD ...

随机推荐

  1. JavaSwing实现的文本比较软件

    先看效果:截图1 截图2: 实现思路: 1.界面UI设计 2.功能点 : a 打开文件进行比较    b 粘贴内容进去比较   c 提示帮助  d 窗口可以任意拖动 3.文本比较算法  java类 : ...

  2. Kubernetes官方java客户端之一:准备

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  3. 什么是Redis?

    Remote Dictionary Server(Redis)是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value 数据库,并提供多种语言的API.它通常被 ...

  4. MQ关于实现最终一致性分布式事务原理解析

    本文讲述阿里云官方文档中关于通过MQ实现分布式事务最终一致性原理 概念介绍 事务消息:消息队列 MQ 提供类似 X/Open XA 的分布式事务功能,通过消息队列 MQ 事务消息能达到分布式事务的最终 ...

  5. container_of 宏

    宏的作用 该宏的作用就是根据结构体中一个成员变量的地址求结构体首地址 如何做到 如果要想根据结构体成员的地址求结构体的首地址,我们需要分三步: 第一步:明确成员变量的地址: 第二步:计算成员变量在该结 ...

  6. JVM 常用命令行工具

    本文部分摘自<深入理解 Java 虚拟机第三版> 基础故障处理工具 Java 开发人员肯定都知道 JDK 的 bin 目录下有许多小工具,这些小工具除了用于编译和运行 Java 程序外,打 ...

  7. ConcurrentHashMap 并发之美

    一.前言 她如暴风雨中的一叶扁舟,在高并发的大风大浪下疾驰而过,眼看就要被湮灭,却又在绝境中绝处逢生 编写一套即稳定.高效.且支持并发的代码,不说难如登天,却也绝非易事. 一直有小伙伴向我咨询关于Co ...

  8. 再看C语言-算法

    通常一个程序包括算法.数据结构.程序设计方法及语言工具和环境这四个方面.其中算法是核心,算法就是解决"做什么"和"如何做"的问题.算法是程序的灵魂,项目中如果接 ...

  9. Docker学习(二)- Docker 安装 Jenkins

    一.拉取镜像 我这里安装的版本是2.222.3-centos,可以去这里获取你需要的版本: https://hub.docker.com/_/jenkins?tab=tags docker pull ...

  10. Kubernetes官方java客户端之六:OpenAPI基本操作

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...