草稿

124 阅读1分钟
public static void main(String[] args) throws IOException {
    BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
    int[] s = Arrays.stream(bf.readLine().split(" ")).mapToInt(Integer::parseInt).toArray();
    bf.close();

    // 构造数组
    List<int[]> list = new ArrayList<>();
    for (int i = 0; i < s.length; i += 2) {
        int[] ints = Arrays.copyOfRange(s, 1, i + 2);
        list.add(ints);
    }

    // 排序
    list.sort((a, b) -> {
        if (a[0] == b[0]) {
            return a[1] - b[1];
        } else {
            return a[0] - b[0];
        }
    });

    // 取交集
    List<int[]> list1 = new ArrayList<>();
    for (int i = 0; i < list.size(); i++) {
        for (int j = i + 1; j < list.size(); j++) {
            int[] ints = list.get(i);
            int[] ints2 = list.get(j);
            int left = Math.max(ints[0], ints2[0]);
            int right = Math.min(ints[1], ints2[1]);
            if (left <= right) {
                list1.add(new int[] {left, right});
            }
        }
    }

    // 排序
    list1.sort((a, b) -> {
        if (a[0] == b[0]) {
            return a[1] - b[1];
        } else {
            return a[0] - b[0];
        }
    });

    List<int[]> list2 = new ArrayList<>();
    int[] temp = new int[]{};
    for (int i = 1; i < list1.size(); i++) {
        int[] unit = getUnit(list1.get(i), list1.get(++i));
        while (unit.length > 0) {
            i++;
            unit = getUnit(unit, list1.get(i));
        }
        list2.add(unit);
        temp = list1.get(i);

    }

}

public static int[] getUnit(int[] a, int[] b) {
    int left = Math.max(a[0], b[0]);
    int right = Math.min(a[0], b[0]);
    if (left <= right) {
        int left1 = Math.min(a[0], b[0]);
        int right1 = Math.max(a[0], b[0]);
        return new int[] {left1, right1};
    }
    return new int[] {};
}
import java.util.*;
import java.util.Scanner;

public class quJianJiaoJi {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        String[] str = in.nextLine().split(" ");
        int[] arr = new int[str.length];
        for (int i = 0; i < arr.length; i++) {
            arr[i] = Integer.parseInt(str[i]);
        }
        // 先计算交集
        List<int[]> res = new ArrayList<>();
        for (int i = 0; i < arr.length; i += 2) {
            for (int j = i + 2; j < arr.length; j += 2) {
                int left = Math.max(arr[i], arr[j]);
                int right = Math.min(arr[i + 1], arr[j + 1]);
                if (left <= right) {
                    res.add(new int[]{left, right});
                }
            }
        }
        // 计算完交集,按从小到大排序,左边界升序,相同,有边界升序
        int[][] ans = res.toArray(new int[res.size()][]);
        Arrays.sort(ans, (a, b) -> (a[0] == b[0] ? a[1] - b[1] : a[0] - b[0]));
        // 求交集的并集
        int[][] result = new int[ans.length][2];
        int index = -1;
        for (int[] an : ans) {
            if (index == -1 || an[0] > result[index][1]) {
                result[++index] = an;
            } else {
                result[index][1] = Math.max(result[index][1], an[1]);
            }
        }
        int[][] last = Arrays.copyOf(result, index + 1);
        for (int i = 0; i < last.length; i++) {
            System.out.print(last[i][0]);
            System.out.print(" ");
            System.out.print(last[i][1]);
            if (i != last.length - 1) {
                System.out.print(" ");
            }
        }
    }
}