Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import java.util.Arrays;
- import java.io.*;
- public class Main {
- // Используем полуинервал, не включаем right.
- // Возвращаем две серединные точки, если в массиве нечётное количество элементов,
- // то это одна и та же точка.
- static int[] getMiddles(int left, int right) {
- int mid_left = (left + right - 1) / 2;
- int mid_right = (left + right) / 2;
- return new int[] {mid_left, mid_right};
- }
- static double findMedian(int[] a, int[] b) {
- if (a.length > b.length) {
- int[] c = a;
- a = b;
- b = c;
- }
- int left_a = 0, left_b = 0, right_a = a.length, right_b = b.length;
- int[] a_middles, b_middles;
- while (true) {
- a_middles = getMiddles(left_a, right_a);
- b_middles = getMiddles(left_b, right_b);
- int offset = a_middles[0] - left_a;
- if (offset == 0) { // осталось не больше 2-х элементов
- break;
- }
- if (a[a_middles[0]] <= b[b_middles[0]] && b[b_middles[1]] <= a[a_middles[1]]) {
- return (b[b_middles[0]] + b[b_middles[1]]) / 2.;
- }
- if (b[b_middles[0]] <= a[a_middles[0]] && a[a_middles[1]] <= b[b_middles[1]]) {
- return (a[a_middles[0]] + a[a_middles[1]]) / 2.;
- }
- if (b[b_middles[1]] <= a[a_middles[1]]) { // сдвигаем в a справа
- right_a -= offset;
- left_b += offset;
- } else { // a[mid_a_left] < b[mid_b_left], сдвигаем в a слева
- left_a += offset;
- right_b -= offset;
- }
- }
- // offset равен единице, если в b осталось больше 2-х элементов.
- int offset = (left_b == b_middles[0]) ? 0 : 1;
- int len_a = right_a - left_a;
- int[] c = new int[len_a + b_middles[1] + 1 - b_middles[0] + 2*offset];
- System.arraycopy(a, left_a, c, 0, len_a);
- System.arraycopy(b, b_middles[0]-offset, c, len_a, c.length-len_a);
- Arrays.sort(c);
- int[] c_middles = getMiddles(0, c.length);
- return (c[c_middles[0]] + c[c_middles[1]]) / 2.;
- }
- public static void main(String[] args) throws IOException {
- BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
- reader.readLine();
- reader.readLine();
- String[] tokens = reader.readLine().trim().split(" ");
- int[] a = new int[tokens.length];
- for (int i=0; i<tokens.length; i++) {
- a[i] = Integer.parseInt(tokens[i]);
- }
- tokens = reader.readLine().trim().split(" ");
- int[] b = new int[tokens.length];
- for (int i=0; i<tokens.length; i++) {
- b[i] = Integer.parseInt(tokens[i]);
- }
- double result = findMedian(a, b);
- System.out.println(result);
- }
- }
Add Comment
Please, Sign In to add comment