UVA 11992 - Fast Matrix Operations(段树)

简介:

UVA 11992 - Fast Matrix Operations

题目链接

题意:给定一个矩阵,3种操作,在一个矩阵中加入值a,设置值a。查询和

思路:因为最多20列,所以全然能够当作20个线段树来做,然后线段树是区间改动区间查询,利用延迟操作,开两个延迟值一个存放set操作。一个存放add操作

代码:

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;

#define lson(x) ((x<<1) + 1)
#define rson(x) ((x<<1) + 2)
#define INF 0x3f3f3f3f

const int N = 1000005;

int r, c, m;

struct Node {
    int l, r;
    int sum, Max, Min, sumv, setv;
} node[4 * N];

void pushup(int x) {
    node[x].sum = node[lson(x)].sum + node[rson(x)].sum;
    node[x].Max = max(node[lson(x)].Max, node[rson(x)].Max);
    node[x].Min = min(node[lson(x)].Min, node[rson(x)].Min);
}

void pushdown(int x) {
    if (node[x].setv) {
	node[lson(x)].sumv = node[rson(x)].sumv = 0;
	node[lson(x)].setv = node[rson(x)].setv = node[x].setv;
	node[lson(x)].sum = (node[lson(x)].r - node[lson(x)].l + 1) * node[x].setv;
	node[rson(x)].sum = (node[rson(x)].r - node[rson(x)].l + 1) * node[x].setv;
	node[lson(x)].Max = node[lson(x)].Min = node[x].setv;
	node[rson(x)].Max = node[rson(x)].Min = node[x].setv;
	node[x].setv = 0;
    }
    if (node[x].sumv) {
	node[lson(x)].sumv += node[x].sumv;
	node[rson(x)].sumv += node[x].sumv;
	node[lson(x)].sum += (node[lson(x)].r - node[lson(x)].l + 1) * node[x].sumv;
	node[rson(x)].sum += (node[rson(x)].r - node[rson(x)].l + 1) * node[x].sumv;
	node[lson(x)].Max += node[x].sumv;
	node[lson(x)].Min += node[x].sumv;
	node[rson(x)].Max += node[x].sumv;
	node[rson(x)].Min += node[x].sumv;
	node[x].sumv = 0;
    }
}

void build(int l, int r, int x) {
    node[x].l = l; node[x].r = r;
    if (l == r) {
	node[x].sum = node[x].Max = node[x].Min = node[x].sumv = node[x].setv = 0;
	return;
    }
    int mid = (l + r) / 2;
    build(l, mid, lson(x));
    build(mid + 1, r, rson(x));
    pushup(x);
}

void add(int l, int r, int v, int x) {
    if (node[x].l >= l && node[x].r <= r) {
	node[x].sumv += v;
	node[x].sum += (node[x].r - node[x].l + 1) * v;
	node[x].Max += v;
	node[x].Min += v;
	return;
    }
    pushdown(x);
    int mid = (node[x].l + node[x].r) / 2;
    if (l <= mid) add(l, r, v, lson(x));
    if (r > mid) add(l, r, v, rson(x));
    pushup(x);
}

void set(int l, int r, int v, int x) {
    if (node[x].l >= l && node[x].r <= r) {
	node[x].setv = v;
	node[x].sum = (node[x].r - node[x].l + 1) * v;
	node[x].Max = node[x].Min = v;
	node[x].sumv = 0;
	return;
    }
    pushdown(x);
    int mid = (node[x].l + node[x].r) / 2;
    if (l <= mid) set(l, r, v, lson(x));
    if (r > mid) set(l, r, v, rson(x));
    pushup(x);
}

Node query(int l, int r, int x) {
    Node ans; ans.sum = 0; ans.Max = 0; ans.Min = INF;
    if (node[x].l >= l && node[x].r <= r) {
	ans.sum = node[x].sum;
	ans.Max = node[x].Max;
	ans.Min = node[x].Min;
	return ans;
    }
    pushdown(x);
    int mid = (node[x].l + node[x].r) / 2;
    if (l <= mid) {
	Node tmp = query(l, r, lson(x));
	ans.sum += tmp.sum;
	ans.Max = max(ans.Max, tmp.Max);
	ans.Min = min(ans.Min, tmp.Min);
    }
    if (r > mid) {
	Node tmp = query(l, r, rson(x));
	ans.sum += tmp.sum;
	ans.Max = max(ans.Max, tmp.Max);
	ans.Min = min(ans.Min, tmp.Min);
    }
    return ans;
}

int main() {
    while (~scanf("%d%d%d", &r, &c, &m)) {
	build(1, r * c, 0);
	int q, x1, y1, x2, y2, v;
	while (m--) {
	    scanf("%d", &q);
	    if (q == 3) {
		scanf("%d%d%d%d", &x1, &y1, &x2, &y2);
		x1--; x2--;
		int sum = 0, Max = 0, Min = INF;
		for (int i = x1; i <= x2; i++) {
		    Node ans = query(i * c + y1, i * c + y2, 0);
		    sum += ans.sum;
		    Max = max(Max, ans.Max);
		    Min = min(Min, ans.Min);
		}
		printf("%d %d %d\n", sum, Min, Max);
	    }
	    else {
		scanf("%d%d%d%d%d", &x1, &y1, &x2, &y2, &v);
		x1--; x2--;
		for (int i = x1; i <= x2; i++) {
		    if (q == 1) add(i * c + y1, i * c + y2, v, 0);
		    else set(i * c + y1, i * c + y2, v, 0);
		}
	    }
	}
    }
    return 0;
}


版权声明:本文博客原创文章,博客,未经同意,不得转载。







本文转自mfrbuaa博客园博客,原文链接:http://www.cnblogs.com/mfrbuaa/p/4750075.html,如需转载请自行联系原作者


相关文章
|
9月前
|
存储 安全 C语言
C++ String揭秘:写高效代码的关键
在C++编程中,字符串操作是不可避免的一部分。从简单的字符串拼接到复杂的文本处理,C++的string类为开发者提供了一种更高效、灵活且安全的方式来管理和操作字符串。本文将从基础操作入手,逐步揭开C++ string类的奥秘,帮助你深入理解其内部机制,并学会如何在实际开发中充分发挥其性能和优势。
|
7月前
|
大数据 BI
《大模型时代的智能BI—Quick BI》评测获奖名单公布
《大模型时代的智能BI—Quick BI》评测获奖名单公布
211 1
|
9月前
|
人工智能 前端开发 程序员
平替cursor吗?通义灵码创造AI导航网站
作为一名古老语言COBOL程序员,我习惯了面向过程的编程方式。近期尝试用通义灵码创建了一个AI导航网站,并发布在微信公众号上。由于前端知识有限,网站的CSS特效是逐步生成的。尽管之前使用过cursor、cline+deepseek等工具,但这次通义灵码的帮助让我更顺利地完成了项目。网站展示了收集的资料和资源,效果令人满意。 [查看网站](https://mp.weixin.qq.com/s/LsrAgdq6-0rnednxDjrqUw)
|
人工智能 安全 数据安全/隐私保护
一个案例,看懂AI Agent厂商的商业落地路径
随着大语言模型技术的进步,国内科技巨头正加速在AI Agent领域的布局,利用自身技术和应用场景推动AI Agent在各行业的深度融合。百度、飞书、钉钉等已推出相关产品,其中实在智能的Agent智能体结合AI和RPA技术,提供高度自主和交互性的软件实体,已在多个场景实现商用并即将公测。企业选择AI Agent时关注点包括与现有自动化解决方案的融合、易用性、数据安全和新业务自动化能力。实在智能的Agent解决方案因其灵活性、安全性及广泛的应用潜力受到青睐。
1223 1
|
人工智能 安全 算法
多端融合,打造最优落地效果的多模态百炼
本次分享由阿里云智能集团飞天实验室资深产品专家江潇和科学家胡露露主讲,介绍了多端融合的多模态百炼产品。内容涵盖多模态模型的优化、生产力和产品力建设、RAG能力升级、终端大模型场景探索、内容安全和生态应用等方面。百炼已支持多模态模型调用,提升了模型效果和应用效果,并在安全性、模型优化和终端部署上取得了显著进展。
|
人工智能 IDE Java
MarsCode AI 一款免费的代码辅助工具,值得一试
MarsCode是由字节跳动旗下公司推出的AI编程工具,旨在提升编码效率和质量。它既是一个云端集成开发环境(IDE),也支持作为VS Code和JetBrains等IDE的智能扩展,提供代码补全、生成、优化等功能,并支持多种编程语言。通过AI助手,MarsCode帮助开发者减少重复劳动,提高代码质量和可维护性,同时支持跨平台使用,为开发者带来便捷高效的编程体验。
2023 1
|
存储 人工智能 弹性计算
解决方案评测|通义万相AI绘画创作测评
解决方案评测|通义万相AI绘画创作测评
960 12
|
缓存 负载均衡 监控
什么是反向代理?
反向代理是一种网络技术,位于Web服务器前,接收客户端请求并转发给适当的后端服务器,对客户端透明。它主要用于负载均衡、提高安全性和性能,例如通过缓存减少服务器负载和处理SSL加密。反向代理的益处包括保护内部服务器、分发流量,但也存在风险,如单点故障、配置复杂性和安全漏洞。为了确保安全和可靠性,需要谨慎配置和管理。
402 2
|
编解码 监控
Zoom + OBS + B 站直播配置
Zoom + OBS + B 站直播配置
454 0
|
JavaScript 前端开发 UED
《vue3实战》通过indexOf方法实现电影评价系统的模糊查询功能
《vue3实战》通过indexOf方法实现电影评价系统的模糊查询功能