939 2022. 01. 31 22:39:22 Abbence Találkozás cpp14 Elfogadva 55/55 39ms 13912 KiB
#include <iostream>
#include <fstream>
#include <stdlib.h>

#define MAXIDO 100000
#define be cin // cin | beFajl

using namespace std;

struct elem{
    int kezd = -1;
    int veg = -1;
    int kov = -1; //index
    int elozo = -1; //index
};

struct intervallum{
    int kezd;
    int veg;
    int hossz;
};

int minTomb[MAXIDO+1]; // indexeket tárol
elem memoria[MAXIDO+1]; // előre lefoglalt tömb, futási idő gyorsításáért

int comp(const void* a, const void* b)
{
    return memoria[*(int*)a].veg - memoria[*(int*)b].veg;
}

int main()
{
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);

    ifstream beFajl;
    beFajl.open("be2.txt");
    int n;
    be >> n;
    int fele = (n%2 == 0 ? n/2 : n/2+1);

    int li = 0;

    for(int i=0; i<n; i++){
        minTomb[i] = i;
        be >> memoria[i].kezd >> memoria[i].veg;
        memoria[i].kov = i+1;
        memoria[i].elozo = i-1;
    }
    beFajl.close();

    qsort(minTomb,n,sizeof(int),comp);

    int lKezd = 0;

    li = lKezd;
    intervallum ans; // megoldások
    ans.kezd = MAXIDO;
    ans.veg = 0;
    for(int j = 0; j<fele; j++){ // elsõ n/2 ember vizsgálata
        if(memoria[li].veg < ans.kezd){
            ans.kezd = memoria[li].veg;
        }
        if(memoria[li].kezd > ans.veg){
            ans.veg = memoria[li].kezd;
        }
        li = memoria[li].kov;
    }
    if(ans.kezd >= ans.veg){
        ans.kezd = ans.veg;
        ans.hossz = 1;
        cout << ans.hossz << endl << ans.kezd << " " << ans.veg << endl;
        return 0;
    }
    else{
        ans.hossz = ans.veg - ans.kezd + 1;
    }

    int minVeg = ans.kezd; // min kereséssel kapjuk meg
    int maxKezd = ans.veg; // max kereséssel kajuk meg, minVeg <= maxKezd
    int k=1;
    do{
        if(minTomb[k] != 0){
            memoria[memoria[minTomb[k]].elozo].kov = memoria[minTomb[k]].kov; // átláncolás
        }
        else{ // 1. elem lekezelése
            lKezd = memoria[k].kov;
        }

        minVeg = memoria[minTomb[k++]].veg;

        maxKezd = memoria[li].kezd; // max beállítása

        if(maxKezd <= minVeg){
            ans.hossz = 1;
            ans.kezd = maxKezd;
            ans.veg = ans.kezd;
        }
        else if(maxKezd - minVeg + 1 < ans.hossz){
            ans.kezd = minVeg;
            ans.veg = maxKezd;
            ans.hossz = ans.veg - ans.kezd + 1;
        }

        li = memoria[li].kov;
    }while(memoria[li].kov != -1);

    cout << ans.hossz << endl << ans.kezd << " " << ans.veg << endl;

    return 0;
}
Részfeladat Összpont Teszt Verdikt Idő Memória
base 55/55
1 Elfogadva 0/0 2ms 1816 KiB
2 Elfogadva 0/0 39ms 7168 KiB
3 Elfogadva 2/2 1ms 3180 KiB
4 Elfogadva 2/2 1ms 3180 KiB
5 Elfogadva 2/2 1ms 3184 KiB
6 Elfogadva 2/2 2ms 3200 KiB
7 Elfogadva 2/2 1ms 3200 KiB
8 Elfogadva 3/3 1ms 3204 KiB
9 Elfogadva 3/3 1ms 3212 KiB
10 Elfogadva 3/3 1ms 3220 KiB
11 Elfogadva 3/3 3ms 3460 KiB
12 Elfogadva 3/3 4ms 3732 KiB
13 Elfogadva 3/3 4ms 3852 KiB
14 Elfogadva 3/3 7ms 4536 KiB
15 Elfogadva 3/3 7ms 4764 KiB
16 Elfogadva 3/3 7ms 4856 KiB
17 Elfogadva 3/3 7ms 5072 KiB
18 Elfogadva 3/3 12ms 6076 KiB
19 Elfogadva 3/3 28ms 10148 KiB
20 Elfogadva 3/3 26ms 11252 KiB
21 Elfogadva 3/3 39ms 12568 KiB
22 Elfogadva 3/3 37ms 13912 KiB