3 条题解

  • 0
    @ 2025-12-28 15:08:40
    /** 
      * 题目:空运物资统计 (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
    上传者