3 条题解
-
0
/** * 题目:空运物资统计 (Corporate Flight Bookings) * 知识点:差分数组 (Difference Array) * 时间复杂度:O(N + M) * 空间复杂度:O(N) */ #include <iostream> #include <vector> using namespace std; // 使用 long long 防止累加过程中溢出 // 虽然本题 seats <= 10000,但 M 可达 2*10^5,总和可能达到 2*10^9,接近 int 极限 // 在 OI 中,涉及"求和"通常无脑上 long long 是比较稳妥的策略 typedef long long ll; const int MAXN = 200005; // 差分数组,开大一点防止 diff[r+1] 越界 ll diff[MAXN]; int main() { // 1. IO 优化,加快大量数据的读写速度 ios::sync_with_stdio(false); cin.tie(nullptr); int n, m; if (!(cin >> n >> m)) return 0; // 2. 处理 M 条订单 (构建差分数组) for (int i = 0; i < m; ++i) { int l, r, v; cin >> l >> r >> v; // 核心差分操作: // 区间 [l, r] 增加 v // 相当于 diff[l] += v, diff[r+1] -= v diff[l] += v; diff[r + 1] -= v; } // 3. 还原原数组 (计算前缀和)并输出 // current_seats 相当于前缀和 sum[i] ll current_seats = 0; for (int i = 1; i <= n; ++i) { current_seats += diff[i]; // 按照题目要求格式输出 cout << current_seats << (i == n ? "" : " "); } cout << "\n"; return 0; }算法思想巧妙:
差分数组的核心思想是将区间更新转化为两个点的操作:diff[l] += v 和 diff[r+1] -= v 通过前缀和还原原数组,将每次区间更新的时间复杂度从 O(r-l+1) 降低到 O(1) 工程实现考虑周全:
使用 long long 类型防止累加过程中的整数溢出 数组大小设为 MAXN = 200005,避免 diff[r+1] 操作越界 加入 IO 优化提升大数据量时的读写效率 代码结构清晰:
三个阶段分明:IO 优化 → 构建差分数组 → 还原并输出 变量命名直观(如 current_seats 清楚表示当前座位数) 注释详细,解释了每个关键步骤的原理 时间复杂度优化显著:
总体复杂度 O(N+M) 相比暴力法 O(N×M) 在处理大量区间操作时优势明显 特别适用于 N 和 M 都很大的场景
信息
- ID
- 19324
- 时间
- 1000ms
- 内存
- 32MiB
- 难度
- 10
- 标签
- (无)
- 递交数
- 3
- 已通过
- 3
- 上传者