10 条题解

  • 1
    @ 2025-5-3 18:52:01

    (Ds-V3的答案)

    #include <iostream>
    #include <vector>
    #include <algorithm>
    using namespace std;
    int main() {
        int l,m;
        cin>>l>>m;
        vector<pair<int,int>> intervals(m);
        for(int i=0;i<m;i++){
            cin>>intervals[i].first>>intervals[i].second;
        }
        sort(intervals.begin(), intervals.end());
        vector<pair<int, int>> merged;
        for (const auto& interval : intervals) {
            if (merged.empty() || interval.first > merged.back().second) {
                merged.push_back(interval);
            } else {
                merged.back().second = max(merged.back().second, interval.second);
            }
        }
        int removed = 0;
        for (const auto& interval : merged) {
            removed += interval.second - interval.first + 1;
        }
        int remaining = l + 1 - removed;
        cout<<remaining<<endl;
        return 0;
    }
    

    代码解释:

    1‌.输入处理‌ :读取马路的长度 l 和区域数目 m,然后读取 m 个区间。
    
    2‌.区间排序‌ :将所有区间按照起始点进行排序,以便后续合并。
    
    3‌.区间合并‌ :遍历排序后的区间,合并重叠或相邻的区间。合并后的区间存储在 merged 向量中。
    
    4‌.计算移除的树木数量‌ :遍历合并后的区间,计算每个区间内的树木数量(end - start + 1),并累加得到
    总共移除的树木数量 removed。
    
    5‌.计算剩余树木数量‌ :马路上原本有 l + 1 棵树(包括0和l的位置),减去移除的树木数量,得到剩余的树
    木数量 remaining。
    
    ‌6.输出结果 ‌:打印剩余的树木数量。
    

    信息

    ID
    5105
    时间
    1000ms
    内存
    125MiB
    难度
    1
    标签
    递交数
    584
    已通过
    310
    上传者