1 条题解

  • 0
    @ 2025-3-23 11:46:25
    • 方法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
    上传者