| 记录编号 |
614972 |
评测结果 |
AAAAAAAAAAAAAAAAAAAA |
| 题目名称 |
1317.数列操作C |
最终得分 |
100 |
| 用户昵称 |
乐未殇 |
是否通过 |
通过 |
| 代码语言 |
C++ |
运行时间 |
4.147 s |
| 提交时间 |
2026-04-22 00:03:31 |
内存使用 |
9.50 MiB |
显示代码纯文本
#include <iostream>
#include <cstdio>
using namespace std;
typedef long long ll;
const int MAXN = 100010;
ll arr[MAXN];
struct Node {
int left, right; // 当前节点维护的区间 [left, right]
ll sum; // 当前区间元素和
ll lazy; // 懒标记:该区间整体还需要加多少
};
Node tree[MAXN * 4];
void build(int node, int left, int right) {
tree[node].left = left;
tree[node].right = right;
tree[node].lazy = 0;
if (left == right) {
tree[node].sum = arr[left];
return;
}
int mid = (left + right) >> 1;
build(node * 2, left, mid);
build(node * 2 + 1, mid + 1, right);
tree[node].sum = tree[node * 2].sum + tree[node * 2 + 1].sum;
}
void pushDown(int node) {
if (tree[node].lazy != 0) {
ll lazyValue = tree[node].lazy;
tree[node * 2].lazy += lazyValue;
tree[node * 2 + 1].lazy += lazyValue;
tree[node * 2].sum += lazyValue * (tree[node * 2].right - tree[node * 2].left + 1);
tree[node * 2 + 1].sum += lazyValue * (tree[node * 2 + 1].right - tree[node * 2 + 1].left + 1);
tree[node].lazy = 0;
}
}
void rangeAdd(int node, int left, int right, ll value) {
if (left <= tree[node].left && tree[node].right <= right) {
tree[node].sum += value * (tree[node].right - tree[node].left + 1);
tree[node].lazy += value;
return;
}
pushDown(node);
int mid = (tree[node].left + tree[node].right) >> 1;
if (left <= mid) {
rangeAdd(node * 2, left, right, value);
}
if (right > mid) {
rangeAdd(node * 2 + 1, left, right, value);
}
tree[node].sum = tree[node * 2].sum + tree[node * 2 + 1].sum;
}
ll rangeQuery(int node, int left, int right) {
if (left <= tree[node].left && tree[node].right <= right) {
return tree[node].sum;
}
pushDown(node);
int mid = (tree[node].left + tree[node].right) >> 1;
ll result = 0;
if (left <= mid) {
result += rangeQuery(node * 2, left, right);
}
if (right > mid) {
result += rangeQuery(node * 2 + 1, left, right);
}
return result;
}
int main() {
freopen("shuliec.in", "r", stdin);
freopen("shuliec.out", "w", stdout);
int n, m;
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> arr[i];
}
build(1, 1, n);
cin >> m;
while (m--) {
char op[3];
int left, right;
cin >> op >> left >> right;
if (op[0] == 'A') {
ll delta;
cin >> delta;
rangeAdd(1, left, right, delta);
} else {
cout << rangeQuery(1, left, right) << '\n';
}
}
return 0;
}