C++---前缀和序列(每日一道算法2023.1.1)

题目:
给定一个长度为 n 的正整数序列 a1,a2,…,an
如果将该序列从小到大排序,则可以得到另一个长度为 n 的正整数序列 b1,b2,…,bn
现在,请你回答 m 个询问,询问共分为以下两种:

  • 1 L R,请你计算并输出 ∑ i = l r a i \sum\limits_{i=l}^ra_i i=lrai
  • 2 L R,请你计算并输出 ∑ i = l r b i \sum\limits_{i=l}^rb_i i=lrbi

输入格式
第一行包含整数 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/
本文仅用作学习记录和交流

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值