4.22 每日一题题解

Posted qfnu-acm

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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;
}

以上是关于4.22 每日一题题解的主要内容,如果未能解决你的问题,请参考以下文章

算法·每日一题(详解+多解)-- day14

寒假每日一题总结(第七天)

寒假每日一题总结(第十五天)

寒假每日一题回文平方(个人练习)详细题解+推导证明(第五天)

4.22 每日一练

Java每日一题——>739. 每日温度(蛮力法,栈方法)

(c)2006-2024 SYSTEM All Rights Reserved IT常识