1 条题解
-
0
解题思路
- 用数组
a
统计每一天实际存入的总金额(若同一天多次存钱,需累加y
)。 - 预处理前缀和数组
b
:b[i]
表示前i
天的总存款(递推式:b[i] = b[i-1] + a[i]
)。 - 对于每次询问
k
,直接输出b[k]
(前缀和数组可直接得到前k
天的总和)。
通过前缀和预处理,将多次查询的总时间复杂度优化至 (O(n + q))。
#include <bits/stdc++.h> using namespace std; #define int long long void solve() { int n; cin >> n; int a[n + 5] = {0}; int b[n + 5] = {0}; for (int i = 1; i <= n; i++){ int x, y; cin >> x >> y; a[x] += y; } for (int i = 1; i <= n; i++){ b[i] = b[i - 1] + a[i]; } int q; cin >> q; while (q--){ int k; cin >> k; cout << b[k] << '\n'; } } signed main() { ios::sync_with_stdio(0); cin.tie(0), cout.tie(0); int t = 1; // cin >> t; while (t--) { solve(); } }
- 用数组
- 1
信息
- ID
- 1151
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 8
- 标签
- (无)
- 递交数
- 322
- 已通过
- 40
- 上传者