HYSBZ2243 染色【树链剖分】

本文介绍了一种利用树链剖分和线段树解决特定树上查询问题的方法。通过重链剖分技术和线段树动态维护,实现高效查询两点间颜色段的数量及更新颜色段的功能。

题意:给定一棵树,有两种操作,1.问两点之间点的颜色段数量 2.把两点之间点都染成某颜色


思路:颜色段,线段树维护区间左端点和右端点,区间合并的时候,两区间中间的两个点颜色相同,就减1。

树链剖分查询,重链跳转那里,看看当前点 和 跳上去的点颜色是否相同,相同减1。


#include<stdio.h>
#include<iostream>
#include<string.h>
#include<string>
#include<stdlib.h>
#include<math.h>
#include<vector>
#include<list>
#include<map>
#include<stack>
#include<queue>
#include<algorithm>
#include<numeric>
#include<functional>
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
#define lson(x) 2*x
#define rson(x) 2*x+1
const int maxn = 2e5+5;
struct Edge
{
	int to,next;
}edge[maxn*2];
int a[maxn]; 
int head[maxn],tot,cnt;
int root,size[maxn],dep[maxn],fa[maxn],son[maxn];
int top[maxn],id[maxn],val[maxn];
/*
size -> 以x为根节点子树的大小   dep -> 深度 
fa   -> 父节点                  son -> 重儿子 
top  -> x所在重链的顶端节点     
id -> 这个点在线段树中的位置 
*/
struct data
{
	int l,r,num,laz,zuo,you;
}node[maxn*4];

void init()
{
	memset(head,-1,sizeof head);
	tot = 0;
	cnt = 0;
}

void add(int x,int y)
{
	edge[tot].to = y;
	edge[tot].next = head[x];
	head[x] = tot++;
}

int dfs1(int x,int pre,int d)
{
	size[x] = 1;
	fa[x] = pre;
	dep[x] = d;
	son[x] = 0;
	for(int i = head[x]; i != -1; i = edge[i].next)
	{
		int y = edge[i].to;
		if(y != pre)
		{
			size[x] += dfs1(y,x,d+1);
			if(size[y] > size[son[x]])
				son[x] = y;
		}
	}
	return size[x];
}

void dfs2(int x,int pre)
{
	id[x] = ++cnt;
	top[x] = pre;
	if(son[x]) dfs2(son[x],pre); //重链 
	for(int i = head[x]; i != -1; i = edge[i].next)
	{
		int y = edge[i].to;
		if(y != fa[x] && y != son[x])
			dfs2(y,y); //轻链
	}
}

void pushup(int cnt)
{
	node[cnt].num = node[lson(cnt)].num + node[rson(cnt)].num;
	if(node[lson(cnt)].you == node[rson(cnt)].zuo)
		node[cnt].num--;
	node[cnt].zuo = node[lson(cnt)].zuo;
	node[cnt].you = node[rson(cnt)].you;
}

void build(int x,int y, int cnt)
{
	node[cnt].l = x;
	node[cnt].r = y;
	node[cnt].laz = -1;
	if(x == y)
	{
		node[cnt].num = 1;
		node[cnt].zuo = node[cnt].you = val[x];
		return;
	}
	int mid = (x+y) / 2;
	build(x,mid,lson(cnt));
	build(mid+1,y,rson(cnt));
	pushup(cnt);
}

void down(int cnt)
{
	if(node[cnt].laz == -1)
		return;
	int val = node[cnt].laz;
	node[lson(cnt)].laz = val;
	node[rson(cnt)].laz = val;
	node[lson(cnt)].zuo = node[lson(cnt)].you = val;
	node[rson(cnt)].zuo = node[rson(cnt)].you = val;
	node[lson(cnt)].num = 1;
	node[rson(cnt)].num = 1;
	node[cnt].laz = -1;
}

void up(int x,int y,int cnt,int val)
{
	if(x == node[cnt].l && y == node[cnt].r)
	{
		node[cnt].laz = val;
		node[cnt].zuo = node[cnt].you = val;
		node[cnt].num = 1;
		return;
	}
	down(cnt);
	int fa = 2*cnt;
	if(x <= node[fa].r)
	{
		if(y <= node[fa].r)
			up(x,y,fa,val);
		else
			up(x,node[fa].r,fa,val);
	}
	fa++;
	if(y >= node[fa].l)
	{
		if(x >= node[fa].l)
			up(x,y,fa,val);
		else
			up(node[fa].l,y,fa,val);
	}
	pushup(cnt);
}

int yan(int x,int y,int cnt)
{
	if(x == node[cnt].l && y == node[cnt].r)
	{
		return node[cnt].zuo;
	}
	if(node[cnt].laz != -1)
		return node[cnt].laz;
	int fa = 2*cnt;
	if(x <= node[fa].r)
	{
		if(y <= node[fa].r)
			return yan(x,y,fa);
		else
			return yan(x,node[fa].r,fa);
	}
	fa++;
	if(y >= node[fa].l)
	{
		if(x >= node[fa].l)
			return yan(x,y,fa);
		else
			return yan(node[fa].l,y,fa);
	}
}

data meg(data a, data b)
{
	data res;
	res.num = a.num + b.num;
	if(a.you == b.zuo)
		res.num--;
	res.zuo = a.zuo;
	res.you = b.you;
	return res;
}

data fid(int x,int y,int cnt)
{
	down(cnt);
	int res = 0;
	if(x == node[cnt].l && y == node[cnt].r)
		return node[cnt];
	int mid = (node[cnt].l + node[cnt].r) / 2;
	if(y <= mid)
		return fid(x,y,lson(cnt));
	else if(x >= mid+1)
		return fid(x,y,rson(cnt));
	else
		return meg( fid(x,mid,lson(cnt)) , fid(mid+1,y,rson(cnt)) );	
}

int qurey(int u,int v)
{
	int ans = 0;
	data res;
	while(top[u] != top[v])
	{
		if(dep[top[u]] < dep[top[v]])
			swap(u,v);
		res = fid(id[top[u]],id[u],1);
		ans += res.num;
		u = top[u];
		if(yan(id[u],id[u],1) == yan(id[fa[u]],id[fa[u]],1))
			ans--;
		u = fa[u];
	}
	if(dep[u] > dep[v])
		swap(u,v);
	res = fid(id[u],id[v],1);
	ans += res.num;
	return ans;//边权,存的都是点的父边,最上面的点用son[u] 
}

void gai(int u,int v,int val)
{
	while(top[u] != top[v])
	{
		if(dep[top[u]] < dep[top[v]])
			swap(u,v);
		up(id[top[u]],id[u],1,val);
		u = top[u];
		u = fa[u];
	}
	if(dep[u] > dep[v])
		swap(u,v);
	up(id[u],id[v],1,val);
}

int main()
{
	int n,q;
	while(scanf("%d%d",&n,&q)!=EOF)
	{
		init();
		for(int i = 1; i <= n; i++)
			scanf("%d",&a[i]);
		for(int i = 1; i < n; i++)
		{
			int a,b;
			scanf("%d%d",&a,&b);
			add(a,b);
			add(b,a);
		}
		root = (n+1) / 2;
		dfs1(root,root,1);
		dfs2(root,root);
		for(int i = 1; i <= n; i++) //点权 
			val[id[i]] = a[i];		
		build(1,cnt,1);
		char op[10];
		while(q--)
		{
			scanf("%s",op);
			if(op[0] == 'Q')
			{
				int a,b;
				scanf("%d%d",&a,&b);
				printf("%d\n",qurey(a,b));
			}
			else
			{
				int a,b,c;
				scanf("%d%d%d",&a,&b,&c);
				gai(a,b,c);
			}
		}	
	}
}


内容概要:本文聚焦于分布式传感器网络中的LEACH(Low-Energy Adaptive Clustering Hierarchy)聚类算法,系统研究其在能量消耗建模与网络生命周期优化方面的性能表现,并结合Matlab代码实现完整的仿真分析流程。研究深入剖析LEACH协议的核心机制,即通过周期性选举簇头节点实现能量负载的均衡分布,从而有效延长网络整体生存时间。内容涵盖传感器节点部署优化、通信能耗模型构建、路由策略设计及能量耗尽过程的动态模拟,重点解决传统LEACH算法中存在的簇头分布不均、能耗集中于特定区域等缺陷。文档不仅提供了LEACH及其改进算法的仿真案例,还拓展至智能优化算法、机器学习、信号处理等多学科交叉应用方向,体现了该研究在物联网、边缘计算和无线传感网络领域的广泛适用性与科研价值。; 适合人群:具备一定编程基础和科研能力,熟悉Matlab仿真环境,从事无线传感器网络、物联网、智能优化算法等相关领域的研究生或科研人员。; 使用场景及目标:①用于无线传感器网络中能量高效路由协议的设计与优化;②通过Matlab仿真实现LEACH算法及其改进版本的性能对比分析;③支撑科研论文复现、算法验证与教学演示;④为分布式系统中的能耗均衡问题提供解决方案参考。; 阅读建议:建议读者按照文档提供的目录结构系统学习,重点关注LEACH算法的核心机制与能量模型构建,结合所提供的Matlab代码进行仿真实践,并参考网盘资源中的完整案例以加深理解。同时可拓展至其他优化算法与通信协议的研究,提升综合科研能力。
内容概要:本文针对电力系统中考虑N-1故障集的安全约束经济调度(SCED)问题,提出了一种兼顾系统安全性与经济性的优化建模方法,并提供了基于Matlab的代码实现。N-1故障集指系统中任一关键元件(如输电线路或发电机)发生故障退出运行的情形,确保在此类故障下系统仍能安全稳定运行是调度决策的核心要求。所构建的SCED模型在满足功率平衡、机组出力能力和线路传输容量等基本物理约束的基础上,进一步引入N-1故障后的安全校验约束,通过优化算法求解出一组既能维持系统安全稳定又可实现发电成本最小化的机组调度方案。该研究对于提升电网韧性、保障供电可靠性以及支撑现代电力系统的安全经济运行具有重要的理论价值与实践意义。; 适合人群:具备电力系统分析、运筹优化理论基础及Matlab编程能力的高校研究生、科研人员和电力行业相关技术人员。; 使用场景及目标:①深入理解安全约束经济调度(SCED)的基本原理与数学建模流程;②掌握N-1安全准则在优化模型中的具体建模方法与实现逻辑;③获取可复现、可调试的Matlab代码实例,用于教学示范、科研复现或作为进一步开发复杂调度模型的基础。; 阅读建议:建议读者结合文档内容与配套代码,重点关注模型中关于N-1故障场景的处理机制与约束构建方式,通过逐步调试与仿真分析,深化对目标函数、决策变量与多重安全约束之间耦合关系的理解。
代码下载链接: https://pan.quark.cn/s/a4b39357ea24 在信息技术领域中,人工智能(AI)已经演变成一个至关重要的分支,特别是以深度学习和神经网络为代表的技术正持续促进科技的发展。本文将聚焦于“人工智能学习路线图”这一核心议题,详细剖析相关知识点,以协助学习者构建一个系统化的知识体系。 从标题入手,“人工神经网络_1、深度学习_1、数学基础_1、深度学习之外的人工智能_1”,这四个关键部分构成了人工智能学习的核心框架。 1. **人工神经网络**:作为人工智能领域的基础,该技术通过模拟人脑神经元的工作机制来构建模型。神经网络包含输入层、隐藏层和输出层,借助权重的调节来处理信息,从而达成分类、识别或预测等任务。掌握神经网络的构造、反向传播方法、激活函数(例如sigmoid、ReLU)以及损失函数(比如均方误差、交叉熵)是学习该领域的基础。 2. **深度学习**:深度学习属于机器学习的一个子集,它借助多层神经网络来识别复杂的模式。深度学习的优势在于能够处理高维数据,例如图像、声音和文本。卷积神经网络(CNN)在图像识别领域效果显著,而循环神经网络(RNN)和长短期记忆网络(LSTM)则适合处理序列数据。除此之外,生成对抗网络(GAN)等生成模型技术也值得关注。 3. **数学基础**:深度学习和神经网络的理论支撑依赖于数学。线性代数通过矩阵运算和特征分解,为理解神经网络的优化过程提供了支持;微积分和梯度下降构成了优化算法的基础,特别是在反向传播中的参数调整;概率论与统计学是理解和构建模型的关键,如贝叶斯定理和最大似然估计;此外,还涉及到优化理论(比如牛顿法、拟牛顿法)和凸分析。 4. **深度学习之外的人工智能**:人工智能的应用范...
源码直接下载地址: https://pan.quark.cn/s/eda4370d97f3 溪谷H5游戏平台联运系统V3.0是一款为H5游戏运营人员量身定制的高效、稳固且具备多种功能的管理解决方案。联运平台是网络游戏领域中常见的商业模式,它允许多个合作方共同推广同一款游戏,并通过利润分配的方式共同享有收益。借助这一系统,开发团队与运营商能够方便地处理游戏、用户、渠道、财务等多个核心领域,达成迅速发布和高效执行的目标。 1. **系统架构** - **前端框架**:该系统或许运用了如React或Vue.js等现代前端技术,确保用户能够获得顺畅的操作体验。 - **后端框架**:可能依托于Node.js、PHP或Java等后端技术,负责执行业务逻辑和数据交流。 - **数据库**:一般会采用MySQL或MongoDB等数据库管理系统来保存用户资料、游戏数据及运营数据统计等信息。 2. **核心功能** - **游戏管理**:系统应能够支持H5游戏的上传、发布、更新,并对游戏状态进行监控,包括游戏的发布、下架、版本迭代等操作。 - **渠道管理**:联运平台需要整合多种推广渠道,例如微信、QQ、浏览器等,并对每个渠道的推广成效进行监测和分析。 - **用户管理**:涵盖用户注册、登录、个人信息维护,以及用户行为数据的收集和剖析。 - **财务管理**:提供详尽的收入报告,包括渠道分成、充值记录、提现请求等,有助于运营商进行账目审核。 - **推广活动**:支持创建和管理各类营销活动,如限时优惠、新手礼包、积分兑换等,以提升用户活跃度和付费转化率。 - **统计分析**:提供即时的运营数据统计,例如DAU(日活跃用户)、ARPU(每用户平均收入)、留存率等,助力优化运营策略...
内容概要:本文研究了一种兼顾功率均分与电能质量恢复的微电网抗拒绝服务(DoS)攻击的混合动态事件触发二次控制策略,并通过Simulink仿真实现。针对微电网在通信链路遭受DoS攻击时可能出现的信息中断与通信资源受限问题,提出一种混合动态事件触发机制,在有效降低通信频率、节约带宽资源的同时,保障控制系统的稳定运行与信息一致性。该策略能够在实现电压和频率精确恢复的同时,确保各分布式电源之间实现高精度的有功与无功功率分配,显著提升孤岛微电网在异常通信环境下的鲁棒性、可靠性和控制经济性。仿真结果充分验证了所提方法在应对周期性或随机性DoS攻击时仍能保持优异的动态响应性能与控制精度,有效解决了传统控制策略在攻击下易出现功率失衡与电能质量恶化的问题。; 适合人群:具备电力系统、自动化或相关领域基础知识,从事微电网控制、分布式能源管理、电力电子与智能电网研究的研究生、科研人员及工程技术人员。; 使用场景及目标:①应用于孤岛微电网在面临网络攻击时的二次控制设计;②解决因通信资源受限或受扰导致的控制性能下降问题;③实现功率精确分配与电能质量协同恢复的综合控制目标; 阅读建议:建议结合Simulink仿真模型深入理解控制逻辑与事件触发机制的设计细节,重点关注抗DoS攻击的能力验证部分,并可拓展至其他类型的网络攻击场景进行对比研究。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值