题目:
给定一个长度为 n 的正整数序列 a1,a2,…,an。
如果将该序列从小到大排序,则可以得到另一个长度为 n 的正整数序列 b1,b2,…,bn。
现在,请你回答 m 个询问,询问共分为以下两种:
1 L R
,请你计算并输出 ∑ i = l r a i \sum\limits_{i=l}^ra_i i=l∑rai2 L R
,请你计算并输出 ∑ i = l r b i \sum\limits_{i=l}^rb_i i=l∑rbi
输入格式
第一行包含整数 n。
第二行包含 n 个正整数 a1,a2,…,an。
第三行包含整数 m。
接下来 m 行,每行包含一个询问,格式如题面描述。
输出格式
共 m 行,每个询问输出一行答案。
数据范围
前 3 个测试点满足 1≤n,m≤10。
所有测试点满足 1≤n,m≤105,1≤ai≤109,1≤l≤r≤n。
输入:
6
6 4 2 7 2 7
3
2 3 6
1 3 4
1 1 6
输出:
24
9
28
#include <iostream>
#include <cstring>
#include <algorithm>
#include <map>
#include <cmath>
using namespace std;
typedef long long LL;
const int N = 100010;
LL a[N], b[N]; //切记这里要开long long哦
int n, m;
int main()
{
//处理读入,把a复制给b,然后对b进行sort
cin >> n;
for (int i = 1; i<=n; i++) cin >> a[i];
memcpy(b, a, sizeof a);
sort(b+1, b+n+1);
//将a和b都处理为前缀和
for (int i = 1; i<=n; i++) {
a[i] += a[i-1];
b[i] += b[i-1];
}
//处理m次询问
cin >> m;
while (m--) {
int mod, l, r;
cin >> mod >> l >> r;
if (mod == 1) cout << a[r] - a[l-1] << endl;
if (mod == 2) cout << b[r] - b[l-1] << endl;
}
return 0;
}
思路:
没什么可说的,就是一个处理前缀和的思路,然后注意一下longlong的数值,2023年第一道水题(hh
新年快乐
声明:
算法思路来源为y总,详细请见https://www.acwing.com/
本文仅用作学习记录和交流