bzoj P4034 [HAOI2015]树上操作

使用PlotNeuralNet绘制深度学习网络图的基本操作 阅读详情

传送门

这道题树剖也蛮裸的,观察一下下标数组我们发现每一棵子树在线段树的下标肯定是连续的,想想dfs的过程就知道了,然后我们就能用树剖维护子树了。通过这题我们也知道了树剖不仅能维护链,也能维护子树。

这题也有更高超的方法,用线段树维护dfs序,对于dfs序中出现的节点我们一个取正一个取负,就可以直接上线段树了。

树剖代码:

#include<iostream>
#include<stdio.h>
#define ll long long
using namespace std;
const int Maxn=100005;
struct node{int v,next;}t[Maxn*2];
struct segment{int l,r;ll sum,tag;}Qt[Maxn*4];
int w[Maxn],head[Maxn],fa[Maxn],depth[Maxn],size[Maxn],top[Maxn],pos[Maxn],son[Maxn];
int n,m,cnt,tmp;
inline void Insert(int u,int v)
{
	cnt++;
	t[cnt].v=v;
	t[cnt].next=head[u];
	head[u]=cnt;
}
void dfs1(int x)
{
	size[x]=1; 
	for(int i=head[x];i;i=t[i].next)
	{
		if(t[i].v==fa[x])continue;
		depth[t[i].v]=depth[x]+1;
		fa[t[i].v]=x;
		dfs1(t[i].v);
		size[x]+=size[t[i].v];
	}
}
void dfs2(int x,int tp)
{
	int k=0;
	pos[x]=++tmp;
	top[x]=tp;
	son[x]=pos[x];
	for(int i=head[x];i;i=t[i].next)
		if(depth[t[i].v]>depth[x]&&size[t[i].v]>size[k])
			k=t[i].v;
	if(k==0)return ;
	dfs2(k,tp);
	son[x]=max(son[k],son[x]);  
	for(int i=head[x];i;i=t[i].next)
		if(depth[t[i].v]>depth[x]&&k!=t[i].v)
		{
			dfs2(t[i].v,t[i].v);
			son[x]=max(son[x],son[t[i].v]);
		}
}
inline void build(int l,int r,int rt)
{
	Qt[rt].l=l;Qt[rt].r=r;int mid=(l+r)>>1;
	if(l==r)return ;
	build(l,mid,rt<<1);
	build(mid+1,r,rt<<1|1);
}
inline void change(int x,int d,int rt)
{
	int l=Qt[rt].l,r=Qt[rt].r,mid=(l+r)>>1;
	if(l==r){Qt[rt].sum=d;return ;}
	if(x<=mid)change(x,d,rt<<1);
	else change(x,d,rt<<1|1);
	Qt[rt].sum=Qt[rt<<1].sum+Qt[rt<<1|1].sum;
}
inline void pushdown(int rt)
{
	int l=Qt[rt].l,r=Qt[rt].r,mid=(l+r)>>1;
	if(Qt[rt].tag==0)return ;
	Qt[rt<<1].sum+=((ll)Qt[rt].tag*(mid-l+1));
	Qt[rt<<1].tag+=Qt[rt].tag;
	Qt[rt<<1|1].sum+=((ll)Qt[rt].tag*(r-mid));
	Qt[rt<<1|1].tag+=Qt[rt].tag;
	Qt[rt].tag=0;
}
inline void add(int lf,int rf,int rt,ll d)
{
	int l=Qt[rt].l,r=Qt[rt].r,mid=(l+r)>>1;
	if(l>=lf&&r<=rf)
	{
		Qt[rt].sum+=((ll)d*(r-l+1));
		Qt[rt].tag+=d;
		return ;
	}
	pushdown(rt);
	if(lf<=mid)add(lf,rf,rt<<1,d);
	if(rf>mid)add(lf,rf,rt<<1|1,d);
	Qt[rt].sum=Qt[rt<<1].sum+Qt[rt<<1|1].sum;
}
inline ll query(int lf,int rf,int rt)
{
	int l=Qt[rt].l,r=Qt[rt].r,mid=(l+r)>>1;ll sum=0;
	if(l>=lf&&r<=rf)return Qt[rt].sum;
	pushdown(rt);
	if(lf<=mid)sum+=query(lf,rf,rt<<1);
	if(rf>mid)sum+=query(lf,rf,rt<<1|1);
	return sum;
}
inline ll Qmax(int x,int y)
{
    ll sum=0;  
    while(top[x]!=top[y])
	{
		if(depth[top[x]]<depth[top[y]])swap(x,y);
		sum+=query(pos[top[x]],pos[x],1);
		x=fa[top[x]];
	}
	if(pos[x]>pos[y])swap(x,y);
	sum+=query(pos[x],pos[y],1);
    return sum;
}
int main()
{
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++)
		scanf("%d",&w[i]);
	for(int i=1;i<=n-1;i++)
	{
		int x,y;
		scanf("%d%d",&x,&y);
		Insert(x,y);
		Insert(y,x);
	}
	dfs1(1);
	dfs2(1,1);
	build(1,n,1);
	for(int i=1;i<=n;i++)
		change(pos[i],w[i],1);
	for(int i=1;i<=m;i++)
	{
		int opt,x,a;
		scanf("%d",&opt);
		if(opt==1){scanf("%d%d",&x,&a);add(pos[x],pos[x],1,a);}
		if(opt==2){scanf("%d%d",&x,&a);add(pos[x],son[x],1,a);}
		if(opt==3){scanf("%d",&x);printf("%lld\n",Qmax(1,x));}
	} 
	return 0;
}


dfs序的代码:

#include<iostream>
#include<stdio.h>
#define ll long long
using namespace std;
const int Maxn=100005;
struct node{int v,next;}t[Maxn*2]; 
struct segment{int l,r;ll sum,tag,flag;}Qt[Maxn*2*4];
int w[Maxn],head[Maxn],_dfs[Maxn*2],_c[Maxn][3],_w[Maxn*2],fa[Maxn];
bool f[Maxn];
int cnt,n,m,tmp;
inline void Insert(int u,int v)
{
	cnt++;
	t[cnt].v=v;
	t[cnt].next=head[u];
	head[u]=cnt;
}
void dfs(int x)
{
	_dfs[++tmp]=x;
	_c[x][0]=tmp;
	_w[tmp]=w[x];
	for(int i=head[x];i;i=t[i].next)
	{
		if(t[i].v==fa[x])continue;
		fa[t[i].v]=x;
		dfs(t[i].v);
	}
	_dfs[++tmp]=x;
	_c[x][1]=tmp;
	_w[tmp]=-w[x];
}
inline void build(int l,int r,int rt)
{
	if(l==r)
	{
		if(f[_dfs[l]])
			Qt[rt].flag=-1;
		else
			Qt[rt].flag=1;
		f[_dfs[l]]=1;
		Qt[rt].sum=_w[l];
		return ;
	}
	int mid=(l+r)>>1;
	build(l,mid,rt<<1);
	build(mid+1,r,rt<<1|1);
	Qt[rt].sum=Qt[rt<<1].sum+Qt[rt<<1|1].sum;
	Qt[rt].flag=Qt[rt<<1].flag+Qt[rt<<1|1].flag;
}
inline void pushdown(int x,int l,int r)
{
	if(Qt[x].tag==0)return ;
	int mid=(l+r)>>1;
	Qt[x<<1].sum+=(ll)(Qt[x<<1].flag*Qt[x].tag);
	Qt[x<<1].tag+=Qt[x].tag;
	Qt[x<<1|1].sum+=(ll)(Qt[x<<1|1].flag*Qt[x].tag);
	Qt[x<<1|1].tag+=Qt[x].tag;
	Qt[x].tag=0;
}
inline void add(int l,int r,int lf,int rf,int rt,int d)
{
	if(l>=lf&&r<=rf)
	{
		Qt[rt].sum+=(ll)(Qt[rt].flag*d);
		Qt[rt].tag+=d;
		return ;
	}
	pushdown(rt,l,r);
	int mid=(l+r)>>1;
	if(lf<=mid)add(l,mid,lf,rf,rt<<1,d);
	if(rf>mid)add(mid+1,r,lf,rf,rt<<1|1,d);
	Qt[rt].sum=Qt[rt<<1].sum+Qt[rt<<1|1].sum;
}
inline ll query(int l,int r,int lf,int rf,int rt)
{
	if(l>=lf&&r<=rf)return Qt[rt].sum;
	pushdown(rt,l,r);
	int mid=(l+r)>>1;ll sum=0;
	if(lf<=mid)sum+=query(l,mid,lf,rf,rt<<1);
	if(rf>mid)sum+=query(mid+1,r,lf,rf,rt<<1|1);
	return sum;
}
int main()
{
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++)
		scanf("%d",&w[i]);
	for(int i=1;i<=n-1;i++)
	{
		int x,y;
		scanf("%d%d",&x,&y);
		Insert(x,y);
		Insert(y,x);
	}
	dfs(1);
	build(1,n*2,1);
	for(int i=1;i<=m;i++)
	{
		int opt,x,a;
		scanf("%d",&opt);
		if(opt==1){scanf("%d%d",&x,&a);add(1,2*n,_c[x][0],_c[x][0],1,a);add(1,2*n,_c[x][1],_c[x][1],1,a);}
		if(opt==2){scanf("%d%d",&x,&a);add(1,2*n,_c[x][0],_c[x][1],1,a);}
		if(opt==3){scanf("%d",&x);printf("%lld\n",query(1,2*n,1,_c[x][0],1));}
	}
	return 0;
} 


061、LQR(线性二次型调节器)控制基础 本文介绍了LQR(线性二次型调节器)控制在飞控系统中的应用。作者通过一次四旋翼炸机事故引出PID控制的局限性,详细讲解了LQR的数学原理、权重矩阵的物理意义以及实际工程实现方法。文章对比了LQR与PID的控制效果,指出LQR在鲁棒性方面的优势,同时也分析了其存在稳态误差等缺点。最后总结了LQR在飞控中的适用场景,建议将LQR与PID结合使用,并预告了下一章将讨论带积分项的LQI控制。全文包含具体案例、代码实现和调参经验,为飞控算法开发者提供了实用指导。 阅读详情

相关推荐

芯片低功耗设计的两种常用EDA流程

如题。

EricWZY2008的专栏 5558

BZOJ4034: [HAOI2015]树上操作(洛谷P3178)

树链剖分

forezxl的博客 629

ADS新手必看:用Filter DesignGuide快速搞定一个4GHz LC低通滤波器(附保姆级避坑指南)

本文为ADS新手提供了4GHz LC低通滤波器的完整设计流程,重点介绍了如何使用Filter DesignGuide避免参数设置陷阱、正确解读仿真结果以及解决实际电路与理论值的偏差问题。通过真实工程案例,详细讲解了工程创建、Filter DesignGuide配置、电路优化、仿真设置及实际工程中的进阶技巧,帮助工程师快速掌握LC滤波器设计。

weixin_30878501的博客 301

洛谷 P3178 BZOJ 4034 [HAOI2015]树上操作

题目描述 有一棵点数为 N 的树,以点 1 为根,且树点有边权。然后有 M 个操作,分为三种:操作 1 :把某个节点 x 的点权增加 a 。操作 2 :把某个节点 x 为根的子树中所有点的点权都增加 a 。操作 3 :询问某个节点 x 到根的路径中所有点的点权和。 输入输出格式 输入格式: 第一行包含两个整数 N, M 。表示点数和操作数。接下来一行...

weixin_33896069的博客 196

MST-GAT: Enhancing Anomaly Detection in Multimodal Time Series with Intra- and Inter-Modal Attention

本文深入解析了MST-GAT模型,这是一种通过模态内与模态间注意力机制增强多模态时间序列异常检测的新方法。它通过构建图结构显式建模传感器间的复杂时空依赖,并结合时间卷积网络与联合优化策略,有效降低了传统方法中常见的误报与漏报问题,在工业监控等场景中展现出卓越性能。

weixin_29079671的博客 150

共模电感在EMI滤波中的实战应用与设计技巧

本文深入探讨了共模电感在EMI滤波中的关键作用与设计技巧,涵盖电感值选择、饱和电流风险、磁芯材料性能及绕组工艺等实战经验。通过具体案例解析,展示了共模电感在开关电源、高速接口及汽车电子中的高效应用,帮助工程师解决电磁兼容问题并提升信号完整性。

weixin_27051161的博客 418

BZOJ 4034[HAOI2015]树上操作 树链剖分

BZOJ 4034[HAOI2015]树上操作 树链剖分 Code: #include <bits/stdc++.h> #define setIO(s) freopen(s".in","r",stdin), freopen(s".out","w",stdout) #define maxn 110000 #define ...

EM LGH 130

非洲秃鹫优化算法(AVOA)详解:从原理到实战

非洲秃鹫优化算法(AVOA)是一种模拟秃鹫觅食行为的元启发式算法。该算法通过数学建模秃鹫的群体分工、饥饿感知和食物竞争等行为,将优化问题转化为智能觅食过程。AVOA包含四个关键阶段:(1)种群初始化与最佳秃鹫选择;(2)饥饿率控制探索与开发平衡;(3)探索阶段模拟远距离飞行搜索;(4)开发阶段模拟食物源附近的竞争行为。算法采用饥饿率函数实现自适应搜索,初期偏向全局探索,后期转向局部开发。实验表明AVOA在标准测试函数和工程设计问题上表现出优越性能,其创新性在于将秃鹫独特的生物学特性转化为高效的优化机制。

qq_42212808的博客 228

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

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

romiqi 245

Vue3 - Element Plus 表格组件 el-table “表格行数据中又嵌套了二维对象数组“,按平级循环渲染(嵌套数组视为同级行数据), 对嵌套的数组循环展示为表格,智能合并行或列详细教程

vue3,nuxt3,element-plus,table表格组件,el-table,vue3element表格组件,数据中有二维数组怎么遍历循环显示,表格数据带二级数组怎么循环渲染显示,表格数据中存在一个数组要怎么才能显示到表格,el-table表格合并详细教程示例,table表格如果对象里面还有对象数组那该怎么去渲染,平常都是数组中一个对象渲染成一行,每行中还有嵌套数组怎么办,每个行数据下还有一个数组怎么显示,怎么把表格相同的数据合并为一行,合并上下两行相同数据单元格,合并行或列如果遇到相同单元格就合

🏆 前端领域优质创作者 1万+

CANFD加速是什么?和CANFD有什么区别?

在使用CAN设备上位机的时候,已经选择了CANFD,但还有一个选项是“CANFD加速”,那CANFD加速和不加速有什么区别呢?刚接触CANFD小伙伴肯定一脸懵,本篇主要是给大家分享一下他们的区别,如果对你有帮助,请转发,收藏,点赞💐🎉👍😊

汽车电子软件领域知识分享 1038

[bzoj4034][HAOI2015]树上操作

树链剖分 bzoj4034

Venishel的博客 680

(2-4-01)目标检测与分割:地面提取(1)

请看下面的例子,生成了虚拟 LiDAR 点云数据,然后使用 DBSCAN 聚类方法进行 LiDAR 地面提取,并根据聚类结果可视化地面和非地面点云。首先生成虚拟 LiDAR 点云数据,然后基于设定的高程阈值进行地面提取,并通过 Open3D 可视化地面和非地面点云。地面提取是LiDAR(激光雷达)数据处理中的一个重要步骤,其目标是从点云数据中分离出地面点,即地面表面上的点。LiDAR点云数据通常包含地面点和非地面点(例如建筑物、树木等),地面提取的目标是从这些点中准确识别和提取地面点。

码农三叔 703

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

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

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

hmc0411的博客 1059

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

[BZOJ4034][HAOI2015]树上操作

题目描述Description 有一棵点数为 N 的树,以点 1 为根,且树点有边权。然后有 M 个 操作,分为三种: 操作 1 :把某个节点 x 的点权增加 a 。 操作 2 :把某个节点 x 为根的子树中所有点的点权都增加 a 。 操作 3 :询问某个节点 x 到根的路径中所有点的点权和。 输入描述Inpu...

XIN13261615514的博客 123

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

BZOJ 4034 [HAOI2015]树上操作

树链剖分

sdfzrlt的博客 474

【BZOJ4034】【HAOI2015】树上操作

题目请自行查阅传送门。 典型的树剖题,线段树维护操作,记一下子树在线段树内范围即可。 时间复杂度:\( O(m \log^{2} n) \) #include <stdio.h> #define MN 100005 #define Mn (1<<17) #define ls (k<<1) #define rs (k<<1|...

dizhongchen2809的博客 74

bzoj4034 [HAOI2015]树上操作——树链剖分

题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4034 树剖裸题; 一定要注意 long long !!! update 的时候别忘了 pushdown ... 代码如下: #include<iostream> #include<cstdio> #include<cstring&gt...

aodan5477的博客 137

【bzoj4034】【HAOI2015】树上操作

题目描述 有一棵点数为 N 的树,以点 1 为根,且树点有边权。然后有 M 个 操作,分为三种: 操作 1 :把某个节点 x 的点权增加 a 。 操作 2 :把某个节点 x 为根的子树中所有点的点权都增加 a 。 操作 3 :询问某个节点 x 到根的路径中所有点的点权和。 输入 第一行包含两个整数 N, M 。表示点数和操作数。接下来一行 N 个整数,表示树中节点的初始权值...

anweiyun4308的博客 89

[BZOJ]4034: [HAOI2015]树上操作

[HAOI2015]树上操作 传送门 题目大意:三个操作 1:a,b,c b节点权值+c 2:a,b,c 以b为根的子树节点权值全部+c 3:a,b 查询b到根路径的权值和。 题解:树链剖分 操作1 ,2是区间修改,3是区间和。 看题解都提示开long long 了,我也开了,可是整形相乘赋值给Long long时爆了。 简直要哭晕了。 代码: #include&lt...

weixin_30666401的博客 112

【BZOJ4034】[HAOI2015]树上操作 树链剖分+线段树

【BZOJ4034】[HAOI2015]树上操作 Description 有一棵点数为 N 的树,以点 1 为根,且树点有边权。然后有 M 个 操作,分为三种: 操作 1 :把某个节点 x 的点权增加 a 。 操作 2 :把某个节点 x 为根的子树中所有点的点权都增加 a 。 操作 3 :询问某个节点 x 到根的路径中所有点的点权和。 Input 第一行包含两个整数...

weixin_30699831的博客 95
上一篇: bzoj P3531 [Sdoi2014]旅行
下一篇: bzoj P4870 [Shoi2017]组合数问题
Leo_Riddle
博客等级 码龄11年 4粉丝 34原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值