CODEVS-1082-线段树练习3-splay

区间操作与Splay树应用
本文探讨了如何使用Splay树进行区间修改与区间求和操作,详细介绍了标记机制的实现与注意事项,包括标记传递与子节点标记生效的处理。

描述

区间修改, 区间求和


分析

  • 想练练splay打标记.
  • 因为splay不支持永久标号, 所以pushdown后必须把标记清掉.
  • 第一次打上标记后要立刻让标记生效.
  • 需要注意的地方是pushdown必须让子结点的标记生效.
#include 
using namespace std;
typedef long long int lli;

const int maxn = 200000 + 10;

int s[maxn], ch[maxn][2];
lli v[maxn], sumv[maxn], inc[maxn];

#define lc ch[o][0]
#define rc ch[o][1]
#define seq ch[rc][0]

void update(int o) {
	s[o] = s[lc] + s[rc] + 1;
	sumv[o] = sumv[lc] + sumv[rc] + v[o];
}

void pushdown(int o) {
	if(!inc[o]) return;
	inc[lc] += inc[o]; v[lc] += inc[o]; sumv[lc] += inc[o] * s[lc];
	inc[rc] += inc[o]; v[rc] += inc[o]; sumv[rc] += inc[o] * s[rc];
	inc[o] = 0;
}

int cmp(int o, int k) {
	if(s[lc] + 1 == k) return -1;
	return k < s[lc] + 1 ? 0 : 1;
}

void rotate(int& o, int d) {
	int p = ch[o][d^1]; ch[o][d^1] = ch[p][d]; ch[p][d] = o;
	update(o); update(p); o = p;
}

void splay(int& o, int k) {
	pushdown(o);
	int d = cmp(o, k);
	if(d == -1) return;
	if(d == 1) k -= (s[lc] + 1);
	int p = ch[o][d];
	pushdown(p);
	int d2 = cmp(p, k);
	if(d2 != -1) {
		int k2 = (d2 == 0 ? k : k-s[ch[p][0]]-1);
		splay(ch[p][d2], k2);
		if(d == d2) rotate(o, d^1); else rotate(ch[o][d], d);
	}
	rotate(o, d^1);
}

void build(int& o, int L, int R) {
	if(L > R) return;
	o = (L+R)>>1;
	build(lc, L, o-1); build(rc, o+1, R);
	update(o);
}

int main() {
	int n, m, o;
	scanf("%d", &n); n += 2;
	for(int i = 2; i < n; i++) scanf("%d", &v[i]);
	build(o, 1, n);
	
	scanf("%d", &m);
	for(int i = 0; i < m; i++) {
		lli x;
		int k, y1, y2;
		scanf("%d %d %d", &k, &y1, &y2);
		y1++; y2++;
		splay(o, y1-1);
		splay(rc, y2+1-(s[lc]+1));
		if(k == 2) printf("%lld\n", sumv[seq]);
		else {
			scanf("%lld", &x);
			inc[seq] += x; v[seq] += x; sumv[seq] += s[seq] * x;
			update(rc); update(o);
		}
	}
	return 0;
}
#include 
using namespace std;
typedef long long lli;

const int maxn = 600000;

lli y1, y2, v;
lli addv[maxn];
lli sumv[maxn];

#define lc (o<<1)
#define rc (o<<1^1)
#define M  (L+R>>1)

void build(int o, int L, int R) {
	if(L == R) scanf("%lld", &sumv[o]);
	else {
		build(lc, L, M);
		build(rc, M+1, R);
		sumv[o] = sumv[lc] + sumv[rc];
	}
}

void update(int o, int L, int R) {
	if(y1 <= L && y2 >= R) {
		addv[o] += v;
		sumv[o] += v*(R-L+1);
	} else {
		if(y1 <= M) update(lc, L, M);
		if(y2 > M) update(rc, M+1, R);
		sumv[o] = sumv[lc] + sumv[rc] + addv[o] * (R-L+1);
	}
}

lli sum_v;
void query(int o, int L, int R, lli add) {
	if(y1 <= L && R <= y2) sum_v += sumv[o] + add*(R-L+1);
	else {
		if(y1 <= M) query(lc, L, M, add + addv[o]);
		if(y2 > M) query(rc, M+1, R, add + addv[o]);
	}
}

int main() {
	int n, m;
	scanf("%d", &n);
	build(1, 1, n);
	
	scanf("%d", &m);
	for(int i = 1; i <= m; i++) {
		int k;
		scanf("%d", &k);
		if(k == 1) {
			scanf("%lld%lld%lld", &y1, &y2, &v);
			update(1, 1, n);
		} else {
			scanf("%lld%lld", &y1, &y2);
			sum_v = 0;
			query(1, 1, n, 0);
			printf("%lld\n", sum_v);
		}
	}
	return 0;
}
#include
using namespace std;
typedef long long lli;

const int maxn = 200000 + 10;
lli n, c1[maxn], c2[maxn], s[maxn];

lli query(int x, lli* c) {
	lli ret = 0;
	for(; x > 0; x += x&-x) ret += c[x];
	return ret;
}

void modify(int x, int d, lli* c) {
	for(; x <= n; x += x&-x) c[x] += d;
}

int main() {
	scanf("%d", &n);
	for(int i = 1; i <= n; i++) {
		scanf("%lld", &s[i]);
		s[i] += s[i-1];
	}
	int m, k, d, L, R;
	scanf("%d", &m);
	for(int i = 1; i <= m; i++) {
		scanf("%d", &k);
		if(k == 1) {
			scanf("%d%d%d", &L, &R, &d);
			modify(L, d, c1);
			modify(R+1, -d, c1);
			modify(L, L*d, c2);
			modify(R+1, -(R+1)*d, c2);
		} else {
			scanf("%d%d", &L, &R);
			lli s1 = s[R]-s[L-1];
			lli s2 = query(R,c1)*(R+1) - query(L-1,c1)*L;
			lli s3 = query(L-1,c2) - query(R,c2);
			printf("%lld\n", s1 + s2 + s3);
		}
	}
	return 0;
}


内容概要:本文详细介绍了一个基于MATLAB实现的线性回归(LR)电力负荷预测项目实例,涵盖了从项目背景、模型架构、算法流程、代码实现到GUI界面设计的完整开发过程。项目通过整合历史负荷、气象数据、节假日信息等多源变量,构建多元线性回归模型,并结合特征工程、数据预处理、正则化方法(如岭回归、LASSO)和模型评估指标(RMSE、MAPE、R²等),提升预测精度与泛化能力。文中还展示了系统化的项目目录结构、自动化部署脚本、可视化分析及工程集成方案,支持批量预测与实时滚动更新,具备高度模块化、可解释性强、部署友好的特点。; 适合人群:具备一定MATLAB编程基础,从事电力系统分析、能源管理、智能电网或数据建模相关工作的工程师、研究人员及高校师生。; 使用场景及目标:①应用于城市电力调度、新能源消纳、智能楼宇用能管理等场景下的短期负荷预测;②帮助理解线性回归在实际工程项目中的建模流程、特征处理与模型优化方法;③通过GUI界面实现交互式预测与结果可视化,支持工程落地与决策辅助; 阅读建议:建议结合提供的完整代码与GUI示例进行实践操作,重点关注数据预处理、特征构造、正则化调优与模型评估部分,深入理解各模块的设计逻辑与工程封装思路,以便迁移到类似的时间序列预测任务中。
【轴承故障诊断】基于SE-TCN和SE-TCN-SVM西储大学轴承故障诊断研究(Matlab代码实现)内容概要:本文介绍了基于SE-TCN(Squeeze-and-Excitation Temporal Convolutional Network)和SE-TCN-SVM的轴承故障诊断方法研究,重点针对西储大学(Case Western Reserve University, CWRU)的轴承数据集进行实验验证。研究通过构建SE-TCN模型提取振动信号中的深层时序特征,并利用SE模块增强关键特征通道的权重,从而提升故障识别精度。为进一步提高分类性能,还将SE-TCN提取的特征输入支持向量机(SVM)进行分类,形成SE-TCN-SVM混合模型。文中提供了完整的Matlab代码实现,便于复现实验结果。该方法在多工况、多故障类型下表现出良好的诊断准确率和鲁棒性,适用于工业设备的智能运维与早期故障预警。; 适合人群:具备一定信号处理和机器学习基础的研究生、科研人员及工程技术人员,尤其适合从事机械故障诊断、智能运维、工业大数据分析等相关领域的研究人员;熟悉Matlab编程者更易上手。; 使用场景及目标:①应用于旋转机械设备(如电机、风机、齿轮箱等)的轴承故障诊断;②作为深度学习与传统分类器结合的典型案例,用于教学与科研参考;③目标是提升故障诊断的自动化水平与准确性,推动智能制造与预测性维护的发展。; 阅读建议:建议读者结合提供的Matlab代码,逐步运行并理解模型构建、特征提取与分类流程,同时尝试在其他公开数据集上迁移应用,以加深对SE-TCN架构与故障诊断流程的理解。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值