比赛 |
2025.3.6 |
评测结果 |
AAAAAAAAAA |
题目名称 |
WHZ 的序列 |
最终得分 |
100 |
用户昵称 |
wdsjl |
运行时间 |
1.499 s |
代码语言 |
C++ |
内存使用 |
17.06 MiB |
提交时间 |
2025-03-06 20:35:14 |
显示代码纯文本
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int MAXN = 2e5 + 10;
struct Node {
int l, r;
int sum_p, sum_n;
int add;
int len() const { return r - l + 1; }
} tr[MAXN << 2];
int a[MAXN];
void pushup(Node& u, const Node& l, const Node& r) {
int left_len = l.len();
u.sum_p = l.sum_p + (left_len % 2 ? r.sum_n : r.sum_p);
u.sum_n = l.sum_n + (left_len % 2 ? r.sum_p : r.sum_n);
}
void apply(Node& u, int d) {
u.sum_p += d * (u.len() % 2);
u.sum_n += d * (- (u.len() % 2));
if (u.l != u.r) {
u.add += d;
}
}
void pushdown(Node& u, Node& l, Node& r) {
if (u.add) {
apply(l, u.add);
apply(r, u.add);
u.add = 0;
}
}
void build(int u, int l, int r) {
tr[u].l = l;
tr[u].r = r;
tr[u].add = 0;
if (l == r) {
tr[u].sum_p = a[l];
tr[u].sum_n = -a[l];
return;
}
int mid = (l + r) >> 1;
build(u << 1, l, mid);
build(u << 1 | 1, mid + 1, r);
pushup(tr[u], tr[u<<1], tr[u<<1|1]);
}
void modify(int u, int l, int r, int d) {
if (tr[u].l >= l && tr[u].r <= r) {
apply(tr[u], d);
return;
}
pushdown(tr[u], tr[u<<1], tr[u<<1|1]);
int mid = (tr[u].l + tr[u].r) >> 1;
if (l <= mid) modify(u << 1, l, r, d);
if (r > mid) modify(u << 1 | 1, l, r, d);
pushup(tr[u], tr[u<<1], tr[u<<1|1]);
}
struct Result {
int sum_p, sum_n, len;
};
Result query(int u, int l, int r) {
if (tr[u].l >= l && tr[u].r <= r) {
return {tr[u].sum_p, tr[u].sum_n, tr[u].len()};
}
pushdown(tr[u], tr[u<<1], tr[u<<1|1]);
int mid = (tr[u].l + tr[u].r) >> 1;
Result res = {0, 0, 0};
if (l <= mid) {
res = query(u << 1, l, r);
}
if (r > mid) {
Result right = query(u << 1 | 1, l, r);
if (res.len == 0) {
res = right;
} else {
int new_sum_p = res.sum_p + (res.len % 2 ? right.sum_n : right.sum_p);
int new_sum_n = res.sum_n + (res.len % 2 ? right.sum_p : right.sum_n);
res = {new_sum_p, new_sum_n, res.len + right.len};
}
}
return res;
}
signed main() {
freopen("whz_sequence.in","r",stdin);
freopen("whz_sequence.out","w",stdout);
int n;
scanf("%lld", &n);
for (int i = 1; i <= n; ++i) {
scanf("%lld", &a[i]);
}
build(1, 1, n);
int q;
scanf("%lld", &q);
while (q--) {
int opt, l, r, d;
scanf("%lld", &opt);
if (opt == 1) {
scanf("%lld%lld%lld", &l, &r, &d);
modify(1, l, r, d);
} else {
scanf("%lld%lld", &l, &r);
Result res = query(1, l, r);
printf("%lld\n", res.sum_p);
}
}
return 0;
}