文章归档算法题解

洛谷-P8218 【深进1.例1】求区间和

P8218 【深进1.例1】求区间和

最直接的做法是读入数组,再逐次读取查询区间,用 for 循环累加左右端点之间的元素,得到这一段的和。

Python 代码如下:

Python
import sys

input = lambda: sys.stdin.readline().strip()
n = int(input())
lst = list(map(int, input().split()))
m = int(input())
for i in range(m):
    left, right = map(int, input().split())
    res = 0
    for j in range(left - 1, right):
        res += lst[j]
    print(res)

C++ 代码如下:

C++
#include<iostream>
#include<vector>
using namespace std;
int main()
{
    int n = 0;
    cin >> n;
    vector<int> v(n,0);
    for (int i = 0; i < n; i++)cin >> v[i];
    int m = 0;
    cin >> m;
    for (int i = 0; i < m; i++)
    {
        int left, right,res=0;
        cin >> left>>right;
        for (int i = left - 1; i < right; i++)res += v[i];
        cout << res << endl;
    }
}

我当时测试时,Python 的直接累加写法会超时,C++ 写法可以通过,但仍有优化空间。例如区间 [3,7] 的和,可以由区间 [0,7] 的和减去区间 [0,2] 的和得到。提前保存 [0,1]、[0,2]、[0,3]……这些前缀区间的和,每次查询就只需做一次减法,时间复杂度为 O(1)。下面的代码用 presum[0]=0 作为空前缀,题目的一基闭区间 [left,right] 对应 presum[right]-presum[left-1]。

C++ 代码如下:

C++
#include<iostream>
#include<vector>
using namespace std;
int main()
{
    int n = 0;
    cin >> n;
    vector<int> v(n, 0);
    for (int i = 0; i < n; i++)cin >> v[i];
    vector<int>presum(n + 1, 0);
    for (int i = 0; i < n; i++)presum[i + 1] = presum[i] + v[i];
    int m = 0;
    cin >> m;
    for (int i = 0; i < m; i++)
    {
        int left, right;
        cin >> left >> right;
        cout << presum[right] - presum[left - 1] << endl;
    }
}

Python 代码如下:

Python
import sys

input = lambda: sys.stdin.readline().strip()
n = int(input())
lst = list(map(int, input().split()))
presum = [0 for _ in range(n + 1)]
for i in range(n):
    presum[i + 1] = presum[i] + lst[i]
m = int(input())
for i in range(m):
    left, right = map(int, input().split())
    print(presum[right] - presum[left - 1])
谢谢你读到这里。 ✧
搜索文章

输入关键词,找一篇想读的手记。

算法专题leetcode双指针经典练习题算法题解leetcode-1438. 绝对差不超过限制的最长连续子数组算法题解leetcode-179. 最大数算法题解leetcode-239. 滑动窗口最大值算法题解leetcode-136. 只出现一次的数字算法专题leetcode动态规划基础练习题算法专题leetcode二叉树基础练习题算法专题leetcode数组双指针练习题算法专题leetcode滑动窗口练习题算法专题leetcode链表双指针练习题算法题解洛谷-P1029 [NOIP 2001 普及组] 最大公约数和最小公倍数问题算法题解leetcode-1979. 找出数组的最大公约数算法题解洛谷-B3634 最大公约数和最小公倍数算法题解洛谷-P10424 [蓝桥杯 2024 省 B] 好数算法题解洛谷-P8716 [蓝桥杯 2020 省 AB2] 回文日期自动化脚本Dr.com校园网自动登录方案算法题解leetcode-2226. 每个小孩最多能分到多少糖果算法题解leetcode-2563. 统计公平数对的数目算法题解leetcode-1.两数之和算法题解洛谷-P8218 【深进1.例1】求区间和
在这座小岛上,慢慢找。ESC 关闭