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 每日一题题解的主要内容,如果未能解决你的问题,请参考以下文章