4.22 每日一题题解

小sun的假期

涉及知识点:

  • 枚举/双指针/区间合并

solution:

  • \(题目是让你输出最大的未被覆盖的区间长度\)
  • \(首先按照l从小到大排序,如果l相等就按照r从小到大排序\)
  • \(什么时候才会产生一段连起来的假期呢?初始化j = 1,i = 2,类似双指针\)
  • \(遍历i,a[j].r <= a[i].l (i > j)的时候,假期长度为a[i].l - a[j].r-1,然后令j=i\)
  • $否则,如果a[j].r > a[i].l,两个区间相交,没有假期,a[j].r 就应该更新成max(a[j].r , a[i].r]) $
  • \(关于左端点和右端点,需要分情况讨论,为了不那么麻烦,就加了两个区间:\)
  • \(a[++n].l = 0,a[n].r = 0;a[++n].l = m+1,a[n].r = m+1;\)

std:

#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int maxx = 100005;
struct node{
    int l,r;
}a[maxx];
bool cmp(node p1,node p2){
    if(p1.l == p2.l)
        return p1.r < p2.r;
    return p1.l < p2.l;
}
int main()
{
    int n,m,ans = 0;
    scanf("%d %d",&m,&n);
    for(int i=1;i<=n;i++){
        scanf("%d %d",&a[i].l,&a[i].r);
    }
    a[++n].l = 0,a[n].r = 0;
    a[++n].l = m+1,a[n].r = m+1;
    sort(a+1,a+1+n,cmp);
    for(int i=2,j=1;i<=n;i++)
    {
        if(a[i].l <= a[j].r)
            a[j].r = max(a[j].r,a[i].r);
        else{
            ans = max(ans,a[i].l - a[j].r -1);
            j = i;
        }
    }
    cout<<ans<<endl;
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/QFNU-ACM/p/12749650.html