【分块模板】P2068统计和

  题目传送门:统计和 - 洛谷

题目大意

给定一个长度为 n,初始值都为 0 的序列 ,有w次操作,每次操作:

x a b 表示将a的值加上b,y a b 表示查询a到b的数字和。

思路

这题其实有很多做法,包括线段树、树状数组等。

但大家既然是来看板子的,那就用分块的写法。先画个图理解一下:

e0e3e6ef9cdf4747919a9bb1e6ab128f.png

这里,我们把n分成了  eq?%5Csqrt%20n 块,对于其中的每一块,我们都可以直接用for循环求出其区间和。

那查询怎么做呢?分三种情况:

44fb0de600ab42d79d21f1213b2ff8c1.png53b3396b4ff1454caf1c1410490c8365.png
430f6ce82a6a4240afc97e1862469150.png

三种情况中,红色部分可以直接用for循环求,而蓝色部分则是通过访问单个块内的区间和得到的

代码

#include<iostream>
#include<cmath>
using namespace std;
#define MaxN 100005
#define MaxB 320
#define For(i, j, k) for(int i = j; i <= k; i++)
#define int long longint n, bs, mb;
//bs:每个块的大小;mb:块的数量
int block[MaxN], a[MaxN];
//block[i]:第i个点所属的块
int l[MaxB], r[MaxB];
//l[i]/r[i]:第i个块左端点和右端点
long long Sum[MaxB];void init(){bs = sqrt(n);For(i, 1, n){block[i] = (i-1) / bs + 1;Sum[block[i]] += a[i];}mb = (n-1) / bs + 1;For(j, 1, mb){            //计算每个块的左右端点l[j] = (j-1) * bs + 1;r[j] = j * bs;}r[mb] = n;
}int query(int x, int y){        //查询[x, y]区间的总和int ans = 0;if(block[x] == block[y]){    For(i, x, y) ans += a[i];    //两边直接相加} else{For(i, block[x]+1, block[y]-1) ans += Sum[i];For(i, x, r[block[x]]) ans += a[i];For(i, l[block[y]], y) ans += a[i];}return ans;
}void modify(int x, int y){        //将x改为ya[x] += y; Sum[block[x]] = 0;    For(i, l[block[x]], r[block[x]])Sum[block[i]] += a[i];
}signed main()
{int q, x, y;char op;cin >> n;For(i, 1, n) a[i] = 0;init();cin >> q;while(q--){cin >> op >> x >> y;if(op == 'y') cout << query(x, y) << endl;else modify(x, y);}return 0;
}

总结

各个数据结构的模板题,

即区间查询、单点修改的区间求和问题,可以说是入门数据结构的基础了,十分重要。

最后,如果你觉得这篇文章还不错,可以点个关注点个赞,这是免费的,你可以随时取消。你的支持永远是作者最大的动力!感谢大家的观看,我们下次见!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/344105.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

8年经验之谈!一文看懂性能测试的流程!

每天做着点点点测试有没有危机感&#xff1f; 突然有一天&#xff0c;领导说&#xff1a;“小王&#xff0c;今天把996福报系统压一下&#xff0c;下班前把压测报告发我邮箱。” 啥&#xff1f;压测&#xff1f;今天&#xff1f;报告&#xff1f;怎么压&#xff1f;怎么写&am…

Flask+ Dependency-injecter+pytest 写测试类

最近在使用这几个在做项目&#xff0c;因为第一次用这个&#xff0c;所以不免有些问题。总结下踩的坑 1.测试类位置 首先测试类约定会放在tests里面&#xff0c;不然有可能发生引入包的问题&#xff0c;会报错某些包找不到。 2. 测试类依赖注入 这里我就用的真实的数据库操作…

蓝桥杯单片机组备赛——蜂鸣器和继电器的基本控制

文章目录 一、蜂鸣器和继电器电路介绍二、题目与答案2.1 题目2.2 答案2.3 重点函数解析 一、蜂鸣器和继电器电路介绍 可以发现两个电路一端都接着VCC&#xff0c;所以我们只要给另一端接上低电平就可以让蜂鸣器和继电器进行工作。与操作LED类似&#xff0c;只不过换了一个74HC5…

小白进公司快速熟悉环境和代码的方法

1.企业开发模式 企业开发模式里&#xff0c;我们的项目模块可能非常多此时我们是不能将所有模块都拉取到本地的&#xff0c;主要原因如下&#xff1a; 我们很可能并没有全部工程代码的权限 微服务集群部署非常复杂&#xff0c;本地部署成本太高 微服务模块众多&#xff0c;本…

vue3用elementplus table渲染二维码使用方法

TOC 在Vue3中实现二维码生成需要使用第三方库来处理生成二维码的逻辑,常用的库有 qrcode和 vue-qrcode,这篇文章主要介绍了在Vue3中使用vue-qrcode库实现二维码生成,需要的朋友可以参考下 本文主要介绍在Vue3中使用qrcode库实现二维码生成的方法。 在Vue3中实现二维码生成需…

酚醛胶面建筑模板 — 广西厂家直销,质保可靠

在现代建筑行业中&#xff0c;选择高质量的建筑板材对于确保施工质量和工程安全至关重要。广西厂家直销的酚醛胶面建筑板&#xff0c;以其卓越的质量和可靠的质保&#xff0c;成为了建筑行业的优选材料。 产品特性 卓越的耐候性&#xff1a;我们的酚醛胶面建筑板采用高品质酚醛…

C++力扣题目106,105--中序和后序,前序和中序遍历构造二叉树

106.从中序与后序遍历序列构造二叉树 力扣题目链接(opens new window) 根据一棵树的中序遍历与后序遍历构造二叉树。 注意: 你可以假设树中没有重复的元素。 例如&#xff0c;给出 中序遍历 inorder [9,3,15,20,7]后序遍历 postorder [9,15,7,20,3] 返回如下的二叉树&am…

计算机缺失msvcp140.dll的修复教程,教你快速解决dll问题

“针对计算机系统中出现的msvcp140.dll文件丢失问题&#xff0c;小编将详细阐述一系列有效的解决方法。首先&#xff0c;msvcp140.dll是Microsoft Visual C Redistributable Package中的一个关键动态链接库文件&#xff0c;对于许多应用程序的正常运行至关重要。当系统提示该文…

Minitab的单因子方差分析的结果

单因子方差分析概述 当有一个类别因子和一个连续响应并且想要确定两个或多个组的总体均值是否存在差异时&#xff0c;可使用 单因子方差分析。如果经检验&#xff0c;发现至少有一组存在差异&#xff0c;请使用单因子方差分析中的比较对话框来标识存在显著差异的组对。 例如&…

Win10安装配置Redis,修改密码

一、下载Redis tporadowski 提供了 支持 Windows平台的 Redis 安装包&#xff0c;目前仍在维护&#xff0c;目前最新版本是 5.0.14&#xff0c;更新速度跟Redis官网也相差好几个大版本。 下载地址&#xff1a;https://github.com/tporadowski/redis/releases 二、Redis 安装 …

MATLAB - 卫星自旋的模型参考自适应控制(MRAC)

系列文章目录 前言 本例展示了如何使用模型参考自适应控制 (MRAC) 控制卫星自旋&#xff0c;使未知控制系统与理想参考模型相匹配。卫星系统在 Simulink 中建模&#xff0c;MRAC 控制器使用 Simulink Control Design™ 软件提供的模型参考自适应控制模块实现。 一、卫星旋转控…

CCF模拟题 202309-2 坐标变换(其二)

问题描述 试题编号&#xff1a; 202309-2 试题名称&#xff1a; 坐标变换&#xff08;其二&#xff09; 时间限制&#xff1a; 1.0s 内存限制&#xff1a; 512.0MB 问题描述&#xff1a; 对于平面直角坐标系上的坐标 &#xff08;x,y&#xff09;&#xff0c;小 P 定义了如下两…