1 条题解

  • 0
    @ 2025-10-8 17:04:46

    题目:区间覆盖高度计算

    输入描述
    第一行包含四个整数 ( n, p, h, m ),其中 ( n ) 为位置数量,( h ) 为初始高度,( m ) 为线段数量。接下来 ( m ) 行每行包含两个整数 ( x, y ),表示一条线段覆盖区间 ([x, y])(( x < y ))。

    输出描述
    共 ( n ) 行,每行一个整数,表示每个位置的最终高度(覆盖次数 + 初始高度 ( h ))。

    #include <bits/stdc++.h>
    using namespace std;
    
    map<pair<int, int>, bool> mp;  // 用于去重重复线段
    int b[11100];  // 差分数组,记录线段覆盖次数
    
    int main() {
        int n, p, h, m;
        scanf("%d%d%d%d", &n, &p, &h, &m);
        memset(b, 0, sizeof(b));  // 初始化差分数组
    
        for (int i = 1, x, y; i <= m; i++) {
            scanf("%d%d", &x, &y);
            if (y < x) swap(x, y);  // 确保x < y
            if (mp[make_pair(x, y)]) continue;  // 若线段已存在,跳过
            mp[make_pair(x, y)] = true;  // 标记线段已处理
            b[x + 1]--;  // 差分数组更新:区间[x+1, y]覆盖次数-1
            b[y]++;      // 差分数组更新:区间[x+1, y]覆盖次数+1
        }
    
        for (int i = 1; i <= n; i++) {
            b[i] += b[i - 1];  // 计算前缀和,得到每个位置的覆盖次数
            printf("%d\n", b[i] + h);  // 输出覆盖次数+初始高度h
        }
    
        return 0;
    }
    
    • 1

    *【差分】最高的牛[USACO07JAN] Tallest Cow S

    信息

    ID
    3290
    时间
    1000ms
    内存
    128MiB
    难度
    5
    标签
    递交数
    52
    已通过
    22
    上传者