https://coderun.yandex.ru/problem/coevals/description Средняя

Решение

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;

public class Main {

    private static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd");

    public static void main(String[] args) throws IOException {
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(System.out));

        // Чтение количества людей
        int N = Integer.parseInt(reader.readLine().trim());
        List<Event> events = new ArrayList<>();

        // Обработка данных каждого человека
        for (int i = 0; i < N; i++) {
            String[] parts = reader.readLine().split(" ");
            int dStart = Integer.parseInt(parts[0]);
            int mStart = Integer.parseInt(parts[1]);
            int yStart = Integer.parseInt(parts[2]);
            int dEnd = Integer.parseInt(parts[3]);
            int mEnd = Integer.parseInt(parts[4]);
            int yEnd = Integer.parseInt(parts[5]);

            // Создание дат рождения и смерти
            LocalDate birthDate = LocalDate.of(yStart, mStart, dStart);
            LocalDate deathDate = LocalDate.of(yEnd, mEnd, dEnd);
            LocalDate startDate = birthDate.plusYears(18); // Дата 18-летия
            LocalDate updateStart = birthDate.plusYears(80); // Дата 80-летия
            LocalDate endDate = updateStart.isBefore(deathDate) ? updateStart : deathDate; // Конец периода

            // Добавление событий, если период валиден
            if (startDate.isBefore(endDate)) {
                events.add(new Event(startDate, 1, i + 1));
                events.add(new Event(endDate, -1, i + 1));
            }
        }

        // Сортировка событий по дате и типу
        events.sort((a, b) -> {
            int dateCompare = a.date.compareTo(b.date);
            if (dateCompare != 0) {
                return dateCompare;
            }
            return Integer.compare(a.type, b.type); // Начало (1) перед концом (-1)
        });

        // Обработка событий и поиск максимальных множеств
        Set<Integer> currentGroup = new HashSet<>();
        List<String> result = new ArrayList<>();

        for (int i = 0; i < events.size(); i++) {
            Event event = events.get(i);
            if (event.type == 1) {
                // Добавление человека в группу при начале периода
                currentGroup.add(event.person);
            } else if (event.type == -1 && !currentGroup.isEmpty()) {
                // Проверка максимального множества при завершении периода
                if (i > 0 && events.get(i - 1).type == 1) {
                    List<Integer> groupList = new ArrayList<>(currentGroup);
                    groupList.sort(Integer::compareTo);
                    result.add(groupList.stream().map(String::valueOf).collect(Collectors.joining(" ")));
                }
                currentGroup.remove(event.person);
            }
        }

        // Вывод результата
        if (result.isEmpty()) {
            writer.write("0");
        } else {
            writer.write(String.join("\\n", result));
        }

        writer.flush();
        reader.close();
        writer.close();
    }

    // Класс для представления события
    static class Event {
        LocalDate date;
        int type; // 1 для начала, -1 для конца
        int person;

        Event(LocalDate date, int type, int person) {
            this.date = date;
            this.type = type;
            this.person = person;
        }
    }
}