1 条题解
-
0
-
方法1:使用结构体存储数据,经过排序后,依次计算每个区间的数量即可
-
方法2:数据过大,将数据离散化一下,进行差分即可
#include <bits/stdc++.h> using namespace std; typedef long long ll; const int N = 2e5 + 10, INF = 0x3f3f3f3f, MOD = 1E9 + 7; struct Edge { int l, r; } edge[N]; int n, m, b[N], d[N], idx; int find(int x) { return lower_bound(b + 1, b + 1 + m, x) - b; } bool cmp(Edge a, Edge b) { return a.l < b.l; } void solve2() { // 结构体排序 + 模拟 sort(edge + 1, edge + 1 + n, cmp); int ed = edge[1].l, tt = 0; for (int i = 1; i <= n; i++) { if (ed < edge[i].l) tt += edge[i].r - edge[i].l; else tt += max(edge[i].r - ed, 0); ed = max(ed, edge[i].r); } cout << tt; } void solve1(){ // 离散化 + 二分 sort(b + 1, b + 1 + idx); m = unique(b + 1, b + 1 + idx) - b - 1; for (int i = 1; i <= n; i++) { int l = find(edge[i].l); int r = find(edge[i].r); d[l]++, d[r]--; } int tt = 0; for (int i = 1; i < m; i++) { d[i] += d[i - 1]; if (d[i]) tt += b[i + 1] - b[i]; } cout << tt; } int main() { cin >> n; for (int i = 1, l, r; i <= n; i++) { cin >> l >> r, edge[i] = {l, r}; b[++idx] = l, b[++idx] = r; } // solve1(); solve2(); return 0; }
-
- 1
信息
- ID
- 1212
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 10
- 已通过
- 2
- 上传者