Editorial for Dòng chảy lặng thầm
Remember to use this editorial only when stuck, and not to copy-paste code from it. Please be respectful to the problem author and editorialist.
Submitting an official solution before solving the problem yourself is a bannable offence.
Submitting an official solution before solving the problem yourself is a bannable offence.
Gợi ý 1 - Xử lý truy vấn mà không cộng lại cả đoạn
Nếu mỗi truy vấn đều duyệt từ l đến r, một đoạn dài có thể bị cộng đi cộng lại nhiều lần. Hãy tính trước thông tin cho mọi tiền tố của mảng.
Gợi ý 2 - Tổng tiền tố
Đặt prefix[i] là tổng các phần tử từ vị trí 1 đến i, và prefix[0] = 0. Khi đó tổng đoạn [l,r] bằng prefix[r] - prefix[l-1].
Lời giải đầy đủ
Ý tưởng
Đọc mảng và tạo mảng tổng tiền tố. Mỗi truy vấn chỉ cần lấy hiệu của hai tổng tiền tố. Vì các phần tử có thể âm và tổng có thể lớn, dùng long long.
Độ phức tạp
Tiền xử lý mất O(N); mỗi truy vấn mất O(1). Tổng thời gian O(N+Q), bộ nhớ O(N).
Code C++17
#include <bits/stdc++.h>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n, q;
cin >> n >> q;
vector<long long> prefix(n + 1, 0);
for (int i = 1; i <= n; ++i) {
long long value;
cin >> value;
prefix[i] = prefix[i - 1] + value;
}
while (q--) {
int l, r;
cin >> l >> r;
cout << prefix[r] - prefix[l - 1] << endl;
}
return 0;
}
Loading...