4.22 Un problema por día

Vacaciones de Xiao Sun

Puntos de conocimiento involucrados:

  • Enumeración / puntero doble / combinación de intervalos

solución:

  • \ (El título es para permitirle generar la mayor longitud de intervalo descubierta \)
  • \ (Primero ordenar según l de pequeño a grande, si l es igual, ordenar según r de pequeño a grande \)
  • \ (¿Cuándo habrá un feriado conectado? Inicialice j = 1, i = 2, similar al puntero doble \)
  • \ (Atravesando i, a [j] .r <= a [i] .l (i> j), la duración de las vacaciones es a [i] .l-a [j] .r-1, luego deje que j = i \)
  • $ De lo contrario, si a [j] .r> a [i] .l, los dos intervalos se cruzan, no hay vacaciones, a [j] .r debe actualizarse al máximo (a [j] .r, a [i]. r]) $
  • \ (Sobre el punto final izquierdo y el punto final derecho, es necesario discutir por situación, para ser menos problemático, agregué dos intervalos: \)
  • \ (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;
}

Supongo que te gusta

Origin www.cnblogs.com/QFNU-ACM/p/12749650.html
Recomendado
Clasificación