【HAOI2015】BZOJ4034 树上操作题解(dfs序+线段树)

基于Ardupilot/PX4固件,APM/PIXhawk硬件的VTOL垂直起降固定翼软硬件参数调试(第一篇)安装调试 基于Ardupilot/PX4固件,APM/PIXhawk硬件的VTOL垂直起降固定翼调试 本文内容大部分来自Kris,我们的K大,在VTOL领域的大牛,在此,非常感谢K大。能引用K大的成果也是自己的荣幸,不便之处还请K大多多包涵,在此引用只是为方便自己日常学习,部分参数表里根据自身情况,增加了相应参数。 1.安装及下载Ardupilot官方固件: VTOL固件的来源可分为Ardupilot官方固... 阅读详情

题目:BZOJ4034.
题目大意:给定一棵 n n n个节点的树,让你支持3个操作:
1.把某个节点 x x x的点权增加 a a a.
2.把某个节点 x x x为根的子树中所有点的点权都增加 a a a.
3.询问某个节点 x x x到根的路径中所有点的点权和.
设操作数为 m m m,则 1 ≤ n , m ≤ 1 0 5 1\leq n,m\leq 10^5 1≤n,m≤105.

这道题显然是道树剖板子题,但是我们强制用dfs序做呢?

我们把dfs序时一个节点入栈出栈各操作一次,现在我们可以让入栈为正,出栈为负,得到一个 1 1 1和 − 1 -1 −1组成的dfs序.

为什么可以这样做?是因为这样维护 [ 1 , i ] [1,i] [1,i]的总权值就是以 i i i节点到根节点这条链上节点的总权值.

也就是说,一条从 x x x到根节点的链的所有节点,就是这棵树dfs的时候,刚好扫到了 x x x,这是被扫到了却未被回溯过的节点.

用dfs的思路来看这是显然的.

那么怎么维护这棵树呢?

我们可以考虑用dfs序搞下来之后,建树时,若这个元素是入栈顺序,则把flag记为 1 1 1,否则记为 − 1 -1 −1,然后合并.

所以AC代码如下:

#include<bits/stdc++.h>
  using namespace std;
#define LL long long
const int N=100000;
int n,m;
LL a[N+1]={0};
struct side{
  int y,next;
}e[2*N+1];
int lin[N+1]={0},top=0;
void ins(int X,int Y){
  e[++top].y=Y;
  e[top].next=lin[X];
  lin[X]=top;
}
bool use[N+1]={0};
int dfn[N+1]={0},low[N+1]={0},tt=0;
LL b[2*N+1]={0};
void dfs(int k){
  use[k]=1;
  dfn[k]=++tt;b[tt]=1LL;
  for (int i=lin[k];i;i=e[i].next)
    if (!use[e[i].y]) dfs(e[i].y);
  low[k]=++tt;b[tt]=-1LL;
}
struct tree{
  int l,r;
  LL sum,flag,tag;
}tr[N*10];
void build(int L,int R,int k=1){
  tr[k].l=L;tr[k].r=R;
  tr[k].sum=tr[k].tag=0LL;
  if (L==R){
    tr[k].flag=b[L];
    return;
  }
  int mid=L+R>>1;
  build(L,mid,k<<1);
  build(mid+1,R,k<<1|1);
  tr[k].flag=tr[k<<1].flag+tr[k<<1|1].flag;
}
void pushdown(int k){
  int ls=k<<1,rs=ls|1;
  tr[ls].tag+=tr[k].tag;
  tr[rs].tag+=tr[k].tag;
  tr[ls].sum+=tr[ls].flag*tr[k].tag;
  tr[rs].sum+=tr[rs].flag*tr[k].tag;
  tr[k].tag=0LL;
}
void add(int L,int R,LL num,int k=1){
  if (tr[k].l==L&&tr[k].r==R){
    tr[k].sum+=tr[k].flag*num;
    tr[k].tag+=num;
    return;
  }
  pushdown(k);
  int mid=tr[k].l+tr[k].r>>1;
  if (R<=mid) add(L,R,num,k<<1);
  else if (L>mid) add(L,R,num,k<<1|1);
    else add(L,mid,num,k<<1),add(mid+1,R,num,k<<1|1);
  tr[k].sum=tr[k<<1].sum+tr[k<<1|1].sum;
}
LL query(int L,int R,int k=1){
  if (tr[k].l==L&&tr[k].r==R) return tr[k].sum;
  int mid=tr[k].l+tr[k].r>>1;
  pushdown(k);
  if (R<=mid) return query(L,R,k<<1);
  else if (L>mid) return query(L,R,k<<1|1);
    else return query(L,mid,k<<1)+query(mid+1,R,k<<1|1);
}
inline void into(){
  scanf("%d%d",&n,&m);
  for (int i=1;i<=n;i++)
    scanf("%lld",&a[i]);
  int x,y;
  for (int i=1;i<n;i++){
    scanf("%d%d",&x,&y);
    ins(x,y);ins(y,x);
  }
}
inline void work(){
  dfs(1);
  build(1,2*n);
  for (int i=1;i<=n;i++)
    add(dfn[i],dfn[i],a[i]),add(low[i],low[i],a[i]);
}
inline void outo(){
  int x,opt;
  LL y;
  for (int i=1;i<=m;i++){
    scanf("%d",&opt);
    switch (opt){
      case 1:scanf("%d%lld",&x,&y);
             add(dfn[x],dfn[x],y);add(low[x],low[x],y);
             break;
      case 2:scanf("%d%lld",&x,&y);
             add(dfn[x],low[x],y);
             break;
      case 3:scanf("%d",&x);
             printf("%lld\n",query(1,dfn[x]));
             break;
    }
  }
}
int main(){
  into();
  work();
  outo();
  return 0;
}
全在这了!全国分省90米、30米、12.5米、5米DEM高程模型数据下载方式汇总 全在这了!全国分省90米、30米、12.5米、5米DEM高程模型数据下载方式汇总 SRTM15(450米)免费下载 https://pan.baidu.com/s/1eO0U6wfzs7YSe2EQdxRJ2Q提取码:o7am GMTED(250米)免费下载 https://pan.baidu.com/share/init?surl=nrbbdbhyNVQV46XwqzqLlg 提取码:V7X9 SRTM3 (90米)免费下载 https://pan.baidu.com/share/.. 阅读详情

相关推荐

网工最容易搞混的三个概念:防火墙、网闸、堡垒机,一文让你轻松搞明白。

网闸的作用可以简单概括为:在两个或多个不同安全级别的网络(如内网和外网、普通网与高安全网、受限网与互联网)之间建立一个严格隔离、信息流转的安全桥梁。它的核心任务是实现数据安全传输与隔离,避免网络之间的直接连接带来的安全隐患。数据传输安全:网闸保证数据从一个网络到另一个网络时,能够进行审查、过滤和转换,防止恶意数据或非法信息被传入内部网络或外部泄露。高安全性隔离:网闸常常用于企业的内外网隔离、军事网络、政府机关等对数据隔离要求极高的环境。

HWP18612324139的博客 3636

BZOJ - 4034 树上操作 (Dfs序列 + 线段树) || (树链剖分 + 线段树)|| (树状数组)

大家都很强, 可与之共勉 。4034: [HAOI2015]树上操作Time Limit: 10 Sec Memory Limit: 256 MB Description有一棵点数为 N 的树,以点 1 为根,且树点有边权。然后有 M 个 操作,分为三种: 操作 1 :把某个节点 x 的点权增加 a 。 操作 2 :把某个节点 x 为根的子树中所有点的点权都增加 a 。 操作 3 :询问

Lazer2001 740

Origin作图——等高线图

最近做一个测试数据图,开始想通过用热图来展示,结果发现热图有很多的小方块,很难呈现出最好的效果,因为数据是有一层一层的递进效果,因此经过尝试后,发现等高线图是个好选择。 热图展示效果如下:其中有很多的小方块不适合,热图制图方法前面有记录。 下面展示等高线图制作方法。首先是导入数据,可以从excal导入,也可以直接复制进去。等方法。 选中要展示的数据,绘图----等高线图 选中箭头,确定。 双击图像,点击线,我们需要把线隐藏了. 双击图像,我们需要调色板,根据自己的选择,一般用调色板的颜色。

qq_42278015的博客 1万+

bzoj4034(dfs序+BIT/链剖+线段树)

记得以前是用链剖+线段树做的,在链剖的时候顺便维护dfs序,思路简单实现起来就有点麻烦了。。 可参照:http://www.cnblogs.com/onlyRP/p/5041702.html 回顾这题发现其实主要是2操作针对子树而3操作针对链,而且唯一的询问操作3的链其实是到根的权值和,那么就想能不能直接dfs序进行操作呢?做一遍dfs序后我们可以用前缀和求出权值和,操作1修改点权值就

qkoqhh 345

C++新手也能搞定!Windows下Cesium-Native编译全流程(附依赖下载技巧)

本文为C++新手详细介绍了在Windows系统下编译Cesium-Native库的全流程。重点针对网络环境不佳的情况,提供了手动下载依赖库的实用技巧,并指导用户使用CMake配置、生成解决方案,最终完成编译与测试验证,帮助开发者成功构建这一处理3D地理空间数据的C++运行时库。

weixin_28839549的博客 380

保姆级教程:在Ubuntu 20.04上从零搞定ROS Noetic和RealSense驱动,为无人机开发铺路

本文提供了一份详细的Ubuntu 20.04环境下ROS Noetic和RealSense驱动安装指南,专为无人机开发环境搭建设计。从系统配置、ROS安装到RealSense驱动集成,涵盖所有关键步骤和常见问题解决方案,帮助开发者快速搭建自主空中机器人开发平台。

weixin_30329623的博客 65

BZOJ4034: [HAOI2015]树上操作

题目链接 树链剖分,单点修改,查询最大值和总和。#include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> #define N 30500 using namespace std; int n,tot,lable,Next[N*2],head[N*2],tree[N*2],a[N

HeKai的博客 514

用74LS160和74LS194搭个复古流水灯:从Multisim仿真到面包板实战(附完整电路图)

本文详细介绍了如何使用74LS160和74LS194芯片搭建复古流水灯电路,从Multisim仿真到面包板实战的全过程。通过解析核心器件特性、提供完整材料清单、仿真验证电路逻辑,以及实际搭建中的布局规划和调试技巧,帮助电子爱好者掌握这一经典数字电路设计项目。

weixin_28736355的博客 388

bzoj4034: [HAOI2015]T2

初学树剖。。。听说是裸题。。。然后就做了。。。 注意某个节点和它的子树DFS序相连,只要记住它子树最大的DFS序即可进行子树修改。 #include #include #define N 2000000 #define ll long long using namespace std; int n,m,x,y,l,p,q; ll s[N*5],up; struct edge{int to,ne

miaom的博客 525

win10+conda+pytorch-gpu安装

pytorch 官网上只有linux和Mac的程序包,没有windows系统的,但是windows系统还是可以用pytorch的。  github: https://github.com/peterjc123/pytorch-scripts 首先要安装anaconda: 推荐清华镜像 https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/ ...

一摩尔自由的博客 1万+

大疆 2021 嵌入式笔试题

在深圳做嵌入式,大疆公司绝对是 Top 级别的,大疆的技术栈也很深。

qq_38769551的博客 2496

bzoj4034: [HAOI2015]树上操作

题目链接 bzoj4034: [HAOI2015]树上操作 题解 树剖线段树 代码 #include<bits/stdc++.h> using namespace std; inline int read() { int x = 0,f = 1; char c = getchar(); while(c < '0' ||c > '9'...

agtvo48266的专栏 195

高渗透率光伏接入配电网的电压越限与谐波治理:基于VSG构网型控制与SVG+APF联合补偿的Simulink仿真研究

本文针对高渗透率光伏接入配电网引发的电压越限和谐波畸变问题,提出了一种分层递进的综合治理方案。通过建立IEEE 33节点配电网的Simulink仿真模型,首先验证了传统跟网型控制下光伏渗透率提高导致的电压越上限(最高达1.08 p.u.)和系统谐波畸变严重(THD达8.72%)问题。进而提出:1)将部分光伏逆变器改造为构网型VSG控制,利用其无功调压能力与虚拟阻抗技术实现本地治理;2)在关键节点加装SVG+APF联合补偿装置进行全局动态无功补偿与谐波滤除。仿真结果表明,该方案能将节点电压控制在0.94-1.

huanghm88的专栏 578

bzoj 4034 [HAOI2015]树上操作 题解(DFS序,线段树,模板)

原题链接 洛谷:点我QωQ bzoj:点我QωQ 题意简述 我们在一个树上搞Gay,给定每个点的初始权值,支持三种操作: 单点加权值 子树加权值 求某个点到根的权值和 点数,操作数都1e51e51e5,所有输入的数的最大值不会超过1e61e61e6(不会爆long longlong\ longlong long) 数据 输入 第一行两个正整数n,mn,mn,m表示点数和操作...

LightningUZ的博客 382

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

【树链剖分(DFS序)+线段树】BZOJ4034(HAOI2015)[树上操作]题解

题目概述有一棵点数为 N 的树,以点 1 为根,且树点有边权。然后有 M 个操作,分为三种:操作 1 :把某个节点 x 的点权增加 a 。操作 2 :把某个节点 x 为根的子树中所有点的点权都增加 a 。操作 3 :询问某个节点 x 到根的路径中所有点的点权和。解题报告操作1,3直接用树链剖分就可以解决,但是操作2什么鬼?实际上很简单,因为树链剖分也在构造一组DFS序(只不过优先重儿子),所以用这组

ZigZagK的博客 489

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

BZOJ 4043 [HAOI2015]树上操作 dfs序 线段树

$ \Rightarrow $ 戳我进BZOJ原题 $ \Rightarrow $ 戳我进洛谷原题 [HAOI2015]树上操作 Time Limit: 10 Sec Memory Limit: 256 MB   Description 有一棵点数为 $ N $ 的树,以点 $ 1 $ 为根,且树点有边权。然后有 $ M $ 个操作,分为三种:   操作 $ 1 $ :把某个节点 $ ...

ayf1988的博客 213

[BZOJ4034][欧拉序]HAOI2015:树上操作

BZOJ4034 这个树剖sb题我写什么呢? 欧拉序 o(nlogn)o(nlogn)o(nlogn) 欧拉序:一个点入栈的时候加入序列,成为左括号,出栈的时候再加入一次,成为右括号 修改就可以直接在欧拉序序列上修改 这里右括号保存与左括号符号相反的值,达到一个类似差分的目的 欧拉序要开两倍空间 Code: #include&lt;bits/stdc++.h&gt; #define rs tr[k...

romiqi 245

BZOJ 4034 HAOI2015 树上操作

4034: [HAOI2015]树上操作 Time Limit:10 SecMemory Limit:256 MBSubmit:6033Solved:1959[Submit][Status][Discuss] Description 有一棵点数为 N 的树,以点 1 为根,且树点有边权。然后有 M 个 操作,分为三种: 操作 1 :把某个节点 x 的点权...

265

BZOJ4034: [HAOI2015]树上操作(DFS序+线段树+树上问题维护贡献值)

题意:传送门 题解:对于1操作而言,当这个点增加一个值时,那么对于它以及它的子树而言路径的贡献都会加上这个值,这个对于刚开始的值也同样是这个道理,对于2操作而言,它以及它的子树都加上一个值,那么对于某个子树内的点贡献增加了(depi−depx+1)∗a=depi∗a+(1−depx)∗a(dep_i-dep_x+1)*a=dep_i*a+(1-dep_x)*a(depi​−depx​+1)∗a=d...

肘子的博客 274

BZOJ4034 HAOI2015 树上操作 线段树+DFS序

题意:给定一棵树,维护:1、一个节点+x 2、一个子树所有节点+x 3、求x到根的路径和 题解:先跑出DFS序,那么一个节点的子树就是这个节点在DFS序中两次出现之间的节点,设s[i],e[i]为i第一次出现和第二次出现的位置,用线段树来维护求和,借鉴差分的思想,那么线段树中s[i]所对应的节点的权值=v[i],e[i]所对应的节点的权值=-v[i]。 #include ...

a18700013354的博客 161

bzoj 4034 [HAOI2015]树上操作

树链剖分

spinning 358

BZOJ---4034: [HAOI2015]树上操作【树链剖分】

题面: BZOJ----4034:[HAOI2015]树上操作 题意: 给定一颗树,支持三种操作:(1)单点修改(2)两点之间的最短路径上的所有点修改(3)询问两点之间的最短路径上的所有点的和 分析: 树链剖分真是个好东西,巧妙地将一棵树拍成线性的,这样就容易用数据结构维护区间问题了,与普通区间操作不同的是,它将树上两点之间的路径划分为logN个编号连续的区间,然后对每个区间进行普通操作...

KobeDuu 257

[bzoj4034][HAOI2015]树上操作

树链剖分 bzoj4034

Venishel的博客 679

BZOJ 4034 [HAOI2015]树上操作(欧拉序+线段树)

题意: 有一棵点数为 N 的树,以点 1 为根,且树点有边权。然后有 M 个 操作,分为三种: 操作 1 :把某个节点 x 的点权增加 a 。 操作 2 :把某个节点 x 为根的子树中所有点的点权都增加 a 。 操作 3 :询问某个节点 x 到根的路径中所有点的点权和。 思路: 处理出这棵树的欧拉序,入栈时为这个点的正权,出栈时为这个点的负权 对于操作1,对x入栈点加a,出栈...

weixin_30568591的博客 138

BZOJ-4034: [HAOI2015]树上操作 (树链剖分 入门题 子树整体修改 线段树 区间修改+查询)

这题就是树链剖分的入门题了,唯一的点就是子树整体修改的部分,dfs序。题意:一棵树,1e5个节点,每个节点有权值,1e5次操作,每次操作要么修改某节点的值,要么修改节点以及其子树中所有点的值,要么询问某点到根路径上所有点的权值和。

hmc0411的博客 1059
上一篇: 蓝书(算法竞赛进阶指南)刷题记录——POJ1845 Sumdiv(逆元)
下一篇: 【SDOI2015】BZOJ3994 约数个数和题解(Mobius反演+除法分块)
hezlik
博客等级 码龄9年 111粉丝 241原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值