社区讨论
萌新才学c++站外水题求条(玄关
灌水区参与者 2已保存回复 5
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 5 条
- 当前快照
- 1 份
- 快照标识符
- @ltuvqpy2
- 此快照首次捕获于
- 2024/03/17 10:10 2 年前
- 此快照最后确认于
- 2024/03/17 11:45 2 年前
rt,求大佬帮帮我这只蒟蒻
题目
给定一个长度为 N 的数列 A,以及 M 条指令,每条指令可能是以下两种之一:
C l r d,表示把 A[l],A[l+1],…,A[r] 都加上 d。
Q l r,表示询问数列中第 l∼r 个数的和。
对于每个询问,输出一个整数表示答案。
输入格式
第一行两个整数 N,M。
第二行 N 个整数 A[i]。
接下来 M 行表示 M 条指令,每条指令的格式如题目描述所示。
输出格式
对于每个询问,输出一个整数表示答案。
每个答案占一行。
数据范围
1≤N,M≤105,
|d|≤10000,
|A[i]|≤109
输入样例:
10 5
WA Code
CPP#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#define int long long
using namespace std;
const int N = 1e5 + 10, L = 1e3 + 1;
int n, m;
int num, a[N];
int blong[L], add[L], summ[L];
signed main()
{
cin >> n >> m;
for (int i = 1; i <= n; i ++ ) cin >> a[i];
num = sqrt(n);
for (int i = 1; i <= n; i ++ ) blong[i] = ceil(float(i) / num), summ[blong[i]] += a[i];
char op;
int l, r, d;
while (m -- )
{
cin >> op;
if (op == 'C')
{
cin >> l >> r >> d;
if (blong[l] == blong[r])
{
for (int i = l; i <= r; i ++ )
a[i] += d, summ[blong[i]] += d;
}
else
{
for (int i = l; i <= num * blong[l]; i ++ ) a[i] += d, summ[blong[i]] += d;
for (int i = blong[l] + 1; i < blong[r]; i ++ ) add[i] += d;
for (int i = (blong[r] - 1) * num + 1; i <= r; i ++ ) a[i] += d, summ[blong[i]] += d;
}
}
else
{
int sum = 0;
cin >> l >> r;
if (blong[l] == blong[r])
{
for (int i = l; i <= r; i ++ )
sum += (a[i] + add[blong[i]]);
}
else
{
for (int i = l; i <= num * blong[l]; i ++ ) sum += (a[i] + add[blong[i]]);
for (int i = blong[l] + 1; i < blong[r]; i ++ ) sum += (summ[i] + add[i] * num);
for (int i = (blong[r] - 1) * num + 1; i <= r; i ++ ) sum += (a[i] + add[blong[i]]);
}
cout << sum << endl;
}
}
return 0;
}
1 2 3 4 5 6 7 8 9 10
Q 4 4
Q 1 10
Q 2 4
C 3 6 3
Q 2 4
输出样例:
4
55
9
15
回复
共 5 条回复,欢迎继续交流。
正在加载回复...