Day8 422. 校门外的树(模拟 区间合并)

我的AC代码(模拟+数组遍历)(O(ML))

思路是用一个数组记录树是否存在,遍历所有铁轨,将铁轨所在区域的树标记为1,最后统计记录为0的数量

#include<iostream>
#include<algorithm>

using namespace std;

const int M = 110,N = 10010;

int l,m;
int b[M],e[M],arr[N];    ///arr表示树,0代表有,1代表无

int main(){
    int cnt=0;
    cin>>l>>m;
    for(int i=0;i<m;++i)
        cin>>b[i]>>e[i];
    for(int i=0;i<m;++i)
        for(int j=b[i];j<=e[i];++j)
            arr[j]=1;
    for(int i=0;i<=l;++i)
        if(arr[i]==0)
            ++cnt;
    cout<<cnt<<endl;
    return 0;
}

区间合并的方法(O(MlogM))

#include<bits/stdc++.h>

using namespace std;

const int N = 110;

int l,m;
pair<int,int> arr[N];     ///存放铁轨

int main(){
    int res=0,st=0,ed=-1;
    cin>>l>>m;
    for(int i=0;i<m;++i)
        cin>>arr[i].first>>arr[i].second;
    sort(arr,arr+m);         ///铁轨按左端点升序排序
    for(int i=0;i<m;++i){
        if(arr[i].first>ed){  ///没有重叠的区间加入结果
            res+=ed-st+1;
            st=arr[i].first;
            ed=arr[i].second;
        }
        else{       ///区间合并
            ed=max(arr[i].second,ed);
        }
    }
    res+=ed-st+1;   ///把最后一段加进来
    cout<<l-res+1<<endl;   ///输出答案是剩下的树的数量
    return 0;
}

处理技巧:使用pair结构

区间合并的步骤:1.将区间按左端点排序

                             2.如果当前区间左端点大于扫描的区间端点,将扫描的区间并入结果

                                否则更新扫描的区间的右端点

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值