比赛 |
EYOI与SBOI开学欢乐赛13th |
评测结果 |
AAWWWWWWWW |
题目名称 |
WHZ 的序列 |
最终得分 |
20 |
用户昵称 |
该账号已注销 |
运行时间 |
2.293 s |
代码语言 |
C++ |
内存使用 |
12.03 MiB |
提交时间 |
2022-10-21 22:04:26 |
显示代码纯文本
#include <bits/stdc++.h>
using namespace std;
int n, q;
long long a[200100], c1[200100], b1[200100], c2[200100], b2[200100];
int lb(int x) {
return x & -x;
}
int add1(int x, int y) {
for (int i = x; i <= n; i += lb(i)) {
c1[i] += y;
b1[i] += (x - 1) * y;
}
return 0;
}
long long query1(int x) {
long long sum = 0;
for (int i = x; i; i -= lb(i)) {
sum += c1[i] * x - b1[i];
}
return sum;
}
int add2(int x, int y) {
for (int i = x; i <= n; i += lb(i)) {
c2[i] += y;
b2[i] += (x - 1) * y;
}
return 0;
}
long long query2(int x) {
long long sum = 0;
for (int i = x; i; i -= lb(i)) {
sum += c2[i] * x - b2[i];
}
return sum;
}
int main() {
freopen("whz_sequence.in", "r", stdin);
freopen("whz_sequence.out", "w", stdout);
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> a[i];
if (i % 2 == 0)
if (i - 2 >= 0)
add1(i / 2, a[i] - a[i - 2]);
else
add1(i / 2, a[i]);
else {
if (i - 2 >= 0)
add2((i + 1) / 2, a[i] - a[i - 2]);
else
add2((i + 1) / 2, a[i]);
}
}
cin >> q;
for (int i = 1; i <= q; i++) {
int x, y, z, w;
cin >> x;
if (x == 1) {
cin >> y >> z >> w;
if (y > z)
swap(y, z);
if (y % 2 == 0) {
if (z % 2 == 0) {
add1(y / 2, w);
add1(z / 2 + 1, -w);
add2(y / 2 + 1, w);
add2(z / 2 + 1, -w);
} else {
add1(y / 2, w);
add1(z / 2 + 1, -w);
add2(y / 2 + 1, w);
add2(z / 2 + 2, -w);
}
} else {
if (z % 2 == 0) {
add1(y / 2 + 1, w);
add1(z / 2 + 1, -w);
add2(y / 2 + 1, w);
add2(z / 2 + 1, -w);
} else {
add1(y / 2 + 1, w);
add1(z / 2 + 1, -w);
add2(y / 2 + 1, w);
add2(z / 2 + 2, -w);
}
}
} else {
cin >> y >> z;
long long sum1 = 0, sum2 = 0, fh1 = 0, fh2 = 0;
if (y > z)
swap(y, z);
if (y % 2 == 0) {
fh1 = 1;
fh2 = -1;
} else {
fh1 = -1;
fh2 = 1;
}
if (y % 2 == 0) {
if (z % 2 == 0) {
sum1 += query1(z / 2) - query1(y / 2 - 1);
sum2 += query2(z / 2) - query2(y / 2);
} else {
sum1 += query1(z / 2) - query1(y / 2 - 1);
sum2 += query2(z / 2 + 1) - query2(y / 2);
}
} else {
if (z % 2 == 0) {
sum1 += query1(z / 2) - query1(y / 2);
sum2 += query2(z / 2) - query2(y / 2);
} else {
sum1 += query1(z / 2) - query1(y / 2);
sum2 += query2(z / 2 + 1) - query2(y / 2);
}
}
long long ans = sum1 * fh1 + sum2 * fh2;
cout << ans << endl;
}
}
return 0;
}