LOJ6280. 数列分块入门 4 题解
涉及操作:
- 区间加法;
- 区间求和。
解题思路:
数列分块。
需要:
- 表示第 个分块单独累加的数值和;
- 表示第 个分块整体累加的数值和(就是分块 内的每个数都会增加 )。
示例程序:
#include <bits/stdc++.h>
using namespace std;
const int maxn = 50050;
int n, blo, bl[maxn];
long long a[maxn], sum[505], tag[505];
/**
tag[i]记录第i个分块的数值和
sum[i]第i个块所有单独增加的元素和
*/
void add(int l, int r, long long val) {
for (int i = l; i <= min(bl[l]*blo, r); i ++)
a[i] += val, sum[bl[i]] += val;
if (bl[l] != bl[r])
for (int i = (bl[r]-1)*blo+1; i <= r; i ++)
a[i] += val, sum[bl[i]] += val;
for (int i = bl[l]+1; i < bl[r]; i ++)
tag[i] += val;
}
long long query(int l, int r, long long M) {
long long ans = 0;
for (int i = l; i <= min(bl[l]*blo, r); i ++)
ans += a[i] + tag[bl[i]];
if (bl[l] != bl[r])
for (int i = (bl[r]-1)*blo+1; i <= r; i ++)
ans += a[i] + tag[bl[i]];
for (int i = bl[l]+1; i < bl[r]; i ++)
ans += sum[i] + tag[i] * blo;
return (ans % M + M) % M;
}
int main() {
ios::sync_with_stdio(0);
cin >> n;
blo = sqrt(n);
for (int i = 1; i <= n; i ++) {
cin >> a[i];
bl[i] = (i - 1) / blo + 1;
sum[bl[i]] += a[i];
}
for (int i = 0; i < n; i ++) {
int op, l, r, c;
cin >> op >> l >> r >> c;
if (op == 0) add(l, r, c);
else cout << query(l, r, c+1) << endl;
}
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
2020-11-08 洛谷P5789 [TJOI2017]可乐(数据加强版) 题解 矩阵快速幂
2020-11-08 洛谷P2233 [HNOI2002]公交车路线 题解 矩阵快速幂