「HDU3966」 树上的询问 - 树链剖分

本文介绍了一道涉及树的动态查询与更新的算法题目,通过树剖与树状数组实现高效路径操作,包括路径上点权的加减及单点权值查询,避免了复杂的线段树实现。

题目描述

给你一棵具有N个点(编号为1到N)M条边的树,并给定各个点权的值,然后有3种操作:

  1. I C1 C2 K:把C1与C2的路径上的所有点权值加上K
  2. D C1 C2 K:把C1与C2的路径上的所有点权值减去K
  3. Q C:查询节点编号为C的权值

分析

树剖模版题,只不过用树状数组就可以了,不必写线段树。

代码

#include <iostream>
#include <cstring>
#include <cstdio>
#include <stack>
#define lowbit(x) ((x)&(-(x)))
using namespace std;
const int N=50005;
struct Edge {
	int to,next;
}e[N*2];
int n,m,p;
int cnt,h[N],v[N];
int dep[N],prt[N],size[N],son[N];
int seg[N],top[N],sum[N];
void addedge(int x,int y) {
	e[++cnt]=(Edge){y,h[x]};
	h[x]=cnt;
}
void Dfs1(int x,int fa) {
	dep[x]=dep[fa]+1;
	size[x]=1;
	for (int i=h[x];i;i=e[i].next) {
		int y=e[i].to;
		if (y==fa) continue;
		prt[y]=x;
		Dfs1(y,x);
		size[x]+=size[y];
		if (size[son[x]]<size[y]) son[x]=y;
	}
}
void Dfs2(int x,int tp) {
	seg[x]=++seg[0];
	top[x]=tp;
	if (son[x]) Dfs2(son[x],top[x]);
	for (int i=h[x];i;i=e[i].next) {
		int y=e[i].to;
		if (top[y]) continue;
		Dfs2(y,y);
	}
}
int Ask(int x) {
	int ret=0;
	while (x) {
		ret+=sum[x];
		x-=lowbit(x);
	}
	return ret;
}
void update(int x,int y) {
	while (x<=seg[0]) {
		sum[x]+=y;
		x+=lowbit(x);
	}
}
void UpRange(int x,int y,int z) {
	int fx=top[x],fy=top[y];
	while (fx!=fy) {
		if (dep[fx]<dep[fy]) {
			swap(x,y);
			swap(fx,fy);
		}
		update(seg[fx],z);
		update(seg[x]+1,-z);
		x=prt[fx];
		fx=top[x];
	}
	if (dep[x]>dep[y]) swap(x,y);
	update(seg[x],z);
	update(seg[y]+1,-z);
}
int main() {
	while (~scanf("%d%d%d",&n,&m,&p)) {
		memset(sum,0,sizeof sum);
		memset(h,0,sizeof h);
		cnt=0;
		for (int i=1;i<=n;i++) scanf("%d",&v[i]);
		for (int i=1;i<=m;i++) {
			int a,b;
			scanf("%d%d",&a,&b);
			addedge(a,b);
			addedge(b,a);
		}
		Dfs1(1,1);
		Dfs2(1,1);
		for (int i=1;i<=n;i++) {
			update(seg[i],v[i]);
			update(seg[i]+1,-v[i]);
		}
		for (int i=1;i<=p;i++) {
			char ch[10];
			int x,y,z;
			scanf("%s%d",ch,&x);
			if (ch[0]=='I') {
				scanf("%d%d",&y,&z);
				UpRange(x,y,z);
			} else if (ch[0]=='D') {
				scanf("%d%d",&y,&z);
				UpRange(x,y,-z);
			} else {
				printf("%d\n",Ask(seg[x]));
			}
		}
	}
	return 0;
}

 

内容概要:本文围绕“基于改进秃鹰算法的微电网群经济优化调度”展开研究,提出了一种改进的秃鹰搜索算法(BES),旨在解决微电网群在复杂运行环境下的多目标、强约束、非线性及高维经济调度问题。通过引入特定优化策略,增强了基础算法的全局搜索能力和收敛效率,克服了传统智能算法易陷入局部最优的缺陷。研究构建了一个包含分布式电源、储能系统与多元负荷的微电网群调度模型,以最小化系统综合运行成本为核心目标,综合考虑功率平衡、设备出力能力、储能运行特性等多重约束件。通过仿真实验验证了所提算法在调度精度、稳定性和计算效率方面相较于传统方法具有明显优势,进一步展示了其在降低能源开支、提升可再生能源消纳水平方面的实际应用价。; 适合人群:具备一定电力系统基础知识或优化算法背景,从事新能源调度、智能优化算法研究与应用等相关领域的研究生、科研人员及工程技术人员。; 使用场景及目标:①应用于微电网群、综合能源系统等场景下的经济调度优化;②为秃鹰算法及其他群体智能算法的改进、复现与性能对比提供参考范例;③服务于科研仿真、算法验证及工程化应用需求。; 阅读建议:建议读者结合文中提供的Matlab代码实现进行实践操作,重关注算法改进机制与调度模型的构建逻辑,同时可借助网盘资源获取完整资料,以加深对算法性能表现与应用场景的理解。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值