import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
/**
* @author Victor Williams Stafusa da Silva
*/
public class Main {
public static void main
(String[] args
) { System.
out.
println(Intervalo.
reduzir(new Intervalo
(1,
3),
new Intervalo
(2,
6),
new Intervalo
(7,
10))); System.
out.
println(Intervalo.
reduzir(new Intervalo
(1,
3),
new Intervalo
(2,
8),
new Intervalo
(7,
10))); System.
out.
println(Intervalo.
reduzir(new Intervalo
(1,
3),
new Intervalo
(4,
7),
new Intervalo
(8,
10))); System.
out.
println(Intervalo.
reduzir(new Intervalo
(1,
3),
new Intervalo
(3,
10))); }
}
final class Intervalo {
private final double a;
private final double b;
public Intervalo(double a, double b) {
this.a = a;
this.b = b;
}
public double getA() {
return a;
}
public double getB() {
return b;
}
@Override
return "[" + a + "<->" + b + "]";
}
public Evento getEventoA() {
return new Evento(true, a);
}
public Evento getEventoB() {
return new Evento(false, b);
}
@SafeVarargs
public static List<Intervalo> reduzir(Intervalo... lista) {
return reduzir
(List.
of(lista
)); }
public static List<Intervalo> reduzir(List<Intervalo> lista) {
List<Evento> eventos = new ArrayList<>(lista.size() * 2);
for (Intervalo i : lista) {
eventos.add(i.getEventoA());
eventos.add(i.getEventoB());
}
List<Intervalo> saida = new ArrayList<>(lista.size());
int contagem = 0;
double inicio
= Double.
NEGATIVE_INFINITY; for (Evento e : eventos) {
if (e.isInicioIntervalo()) {
if (contagem == 0) inicio = e.getPonto();
contagem++;
} else {
contagem--;
if (contagem == 0) saida.add(new Intervalo(inicio, e.getPonto()));
}
}
return saida;
}
}
final class Evento implements Comparable<Evento> {
private final boolean inicioIntervalo;
private final double ponto;
public Evento(boolean inicioIntervalo, double ponto) {
this.inicioIntervalo = inicioIntervalo;
this.ponto = ponto;
}
public boolean isInicioIntervalo() {
return inicioIntervalo;
}
public double getPonto() {
return ponto;
}
@Override
public int compareTo(Evento outro) {
return this.ponto < outro.ponto ? -1
: this.ponto > outro.ponto ? 1
: this.inicioIntervalo == outro.inicioIntervalo ? 0
: this.inicioIntervalo ? -1
: 1;
}
}
aW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CmltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CmltcG9ydCBqYXZhLnV0aWwuTGlzdDsKCi8qKgogKiBAYXV0aG9yIFZpY3RvciBXaWxsaWFtcyBTdGFmdXNhIGRhIFNpbHZhCiAqLwpwdWJsaWMgY2xhc3MgTWFpbiB7CiAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CiAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKEludGVydmFsby5yZWR1emlyKG5ldyBJbnRlcnZhbG8oMSwgMyksIG5ldyBJbnRlcnZhbG8oMiwgNiksIG5ldyBJbnRlcnZhbG8oNywgMTApKSk7CiAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKEludGVydmFsby5yZWR1emlyKG5ldyBJbnRlcnZhbG8oMSwgMyksIG5ldyBJbnRlcnZhbG8oMiwgOCksIG5ldyBJbnRlcnZhbG8oNywgMTApKSk7CiAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKEludGVydmFsby5yZWR1emlyKG5ldyBJbnRlcnZhbG8oMSwgMyksIG5ldyBJbnRlcnZhbG8oNCwgNyksIG5ldyBJbnRlcnZhbG8oOCwgMTApKSk7CiAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKEludGVydmFsby5yZWR1emlyKG5ldyBJbnRlcnZhbG8oMSwgMyksIG5ldyBJbnRlcnZhbG8oMywgMTApKSk7CiAgICB9Cn0KCmZpbmFsIGNsYXNzIEludGVydmFsbyB7CiAgICBwcml2YXRlIGZpbmFsIGRvdWJsZSBhOwogICAgcHJpdmF0ZSBmaW5hbCBkb3VibGUgYjsKCiAgICBwdWJsaWMgSW50ZXJ2YWxvKGRvdWJsZSBhLCBkb3VibGUgYikgewogICAgICAgIGlmIChiIDwgYSkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwogICAgICAgIHRoaXMuYSA9IGE7CiAgICAgICAgdGhpcy5iID0gYjsKICAgIH0KCiAgICBwdWJsaWMgZG91YmxlIGdldEEoKSB7CiAgICAgICByZXR1cm4gYTsKICAgIH0KCiAgICBwdWJsaWMgZG91YmxlIGdldEIoKSB7CiAgICAgICByZXR1cm4gYjsKICAgIH0KCiAgICBAT3ZlcnJpZGUKICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CiAgICAgICAgcmV0dXJuICJbIiArIGEgKyAiPC0+IiArIGIgKyAiXSI7CiAgICB9CgogICAgcHVibGljIEV2ZW50byBnZXRFdmVudG9BKCkgewogICAgICAgIHJldHVybiBuZXcgRXZlbnRvKHRydWUsIGEpOwogICAgfQoKICAgIHB1YmxpYyBFdmVudG8gZ2V0RXZlbnRvQigpIHsKICAgICAgICByZXR1cm4gbmV3IEV2ZW50byhmYWxzZSwgYik7CiAgICB9CgogICAgQFNhZmVWYXJhcmdzCiAgICBwdWJsaWMgc3RhdGljIExpc3Q8SW50ZXJ2YWxvPiByZWR1emlyKEludGVydmFsby4uLiBsaXN0YSkgewogICAgICAgIHJldHVybiByZWR1emlyKExpc3Qub2YobGlzdGEpKTsKICAgIH0KCiAgICBwdWJsaWMgc3RhdGljIExpc3Q8SW50ZXJ2YWxvPiByZWR1emlyKExpc3Q8SW50ZXJ2YWxvPiBsaXN0YSkgewogICAgICAgIExpc3Q8RXZlbnRvPiBldmVudG9zID0gbmV3IEFycmF5TGlzdDw+KGxpc3RhLnNpemUoKSAqIDIpOwogICAgICAgIGZvciAoSW50ZXJ2YWxvIGkgOiBsaXN0YSkgewogICAgICAgICAgICBldmVudG9zLmFkZChpLmdldEV2ZW50b0EoKSk7CiAgICAgICAgICAgIGV2ZW50b3MuYWRkKGkuZ2V0RXZlbnRvQigpKTsKICAgICAgICB9CiAgICAgICAgQ29sbGVjdGlvbnMuc29ydChldmVudG9zKTsKICAgICAgICBMaXN0PEludGVydmFsbz4gc2FpZGEgPSBuZXcgQXJyYXlMaXN0PD4obGlzdGEuc2l6ZSgpKTsKICAgICAgICBpbnQgY29udGFnZW0gPSAwOwogICAgICAgIGRvdWJsZSBpbmljaW8gPSBEb3VibGUuTkVHQVRJVkVfSU5GSU5JVFk7CiAgICAgICAgZm9yIChFdmVudG8gZSA6IGV2ZW50b3MpIHsKICAgICAgICAgICAgaWYgKGUuaXNJbmljaW9JbnRlcnZhbG8oKSkgewogICAgICAgICAgICAgICAgaWYgKGNvbnRhZ2VtID09IDApIGluaWNpbyA9IGUuZ2V0UG9udG8oKTsKICAgICAgICAgICAgICAgIGNvbnRhZ2VtKys7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBjb250YWdlbS0tOwogICAgICAgICAgICAgICAgaWYgKGNvbnRhZ2VtID09IDApIHNhaWRhLmFkZChuZXcgSW50ZXJ2YWxvKGluaWNpbywgZS5nZXRQb250bygpKSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIHNhaWRhOwogICAgfQp9CgpmaW5hbCBjbGFzcyBFdmVudG8gaW1wbGVtZW50cyBDb21wYXJhYmxlPEV2ZW50bz4gewogICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIGluaWNpb0ludGVydmFsbzsKICAgIHByaXZhdGUgZmluYWwgZG91YmxlIHBvbnRvOwoKICAgIHB1YmxpYyBFdmVudG8oYm9vbGVhbiBpbmljaW9JbnRlcnZhbG8sIGRvdWJsZSBwb250bykgewogICAgICAgIHRoaXMuaW5pY2lvSW50ZXJ2YWxvID0gaW5pY2lvSW50ZXJ2YWxvOwogICAgICAgIHRoaXMucG9udG8gPSBwb250bzsKICAgIH0KCiAgICBwdWJsaWMgYm9vbGVhbiBpc0luaWNpb0ludGVydmFsbygpIHsKICAgICAgICByZXR1cm4gaW5pY2lvSW50ZXJ2YWxvOwogICAgfQoKICAgIHB1YmxpYyBkb3VibGUgZ2V0UG9udG8oKSB7CiAgICAgICAgcmV0dXJuIHBvbnRvOwogICAgfQoKICAgIEBPdmVycmlkZQogICAgcHVibGljIGludCBjb21wYXJlVG8oRXZlbnRvIG91dHJvKSB7CiAgICAgICAgcmV0dXJuIHRoaXMucG9udG8gPCBvdXRyby5wb250byA/IC0xCiAgICAgICAgICAgICAgICA6IHRoaXMucG9udG8gPiBvdXRyby5wb250byA/IDEKICAgICAgICAgICAgICAgIDogdGhpcy5pbmljaW9JbnRlcnZhbG8gPT0gb3V0cm8uaW5pY2lvSW50ZXJ2YWxvID8gMAogICAgICAgICAgICAgICAgOiB0aGlzLmluaWNpb0ludGVydmFsbyA/IC0xCiAgICAgICAgICAgICAgICA6IDE7CiAgICB9Cn0=