1 条题解
-
0
题目:区间覆盖高度计算
输入描述:
第一行包含四个整数 ( 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
信息
- ID
- 3290
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- 5
- 标签
- 递交数
- 52
- 已通过
- 22
- 上传者