线段树
#include<cstdio> #pragma warning (disable:4996) using namespace std; int a[10001]; //结构体,存线段树 struct node { int l, r, v; }tree[40001]; //建树 void make_tree(int p, int x, int y) { tree[p].l = x; tree[p].r = y; if (x < y) { int mid = (x + y) / 2; make_tree(p * 2, x, mid); make_tree(p * 2 + 1, mid, y); } if (x == y) return; } //储值 int input(int p) { if (tree[p].l == tree[p].r) { tree[p].v = a[tree[p].l]; return tree[p].v; } tree[p].v = input(tree[p * 2].v) + input(tree[p * 2 + 1].v); return tree[p].v; } //单点修改 void change(int p, int x, int V) { tree[p].v += V; if (tree[p].l == tree[p].r) return; if (x <= tree[p * 2].r) change(p * 2, x, V); if (x >= tree[p * 2 + 1].r) change(p * 2 + 1, x, V); } //查询*(计算xy区间内数的和) int total = 0; int find(int x, int y, int p) { if (tree[p].l >= x && tree[p].r <= y) { total += tree[p].v; return total; } if (x <= tree[p * 2].r) find(x, y, p * 2); if (x >= tree[p * 2 + 1].l) find(x, y, p * 2 + 1); } int main() { int n, m; scanf("%d %d", &n, &m); for (int i = 1; i <= n; i++) { scanf("%d", &a[i]); } make_tree(1, 1, n);//建立线段树 for (int i = 1; i <= m; i++) { int A, x, y, k; scanf("%d", &A); if (A == 1) { scanf("%d %d %d", &x, &y, &k); for (int j = x; j <= y; j++) change(1, j, k); } else if (A == 2) { scanf("%d %d", &x, &y); printf("%d", find(x, y, 1)); } } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律