alex0sunny

golden_mid

Nov 20th, 2021 (edited)
118
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 2.77 KB | None | 0 0
  1. import java.util.Arrays;
  2. import java.io.*;
  3.  
  4.  
  5. public class Main {
  6.  
  7.   // Используем полуинервал, не включаем right.
  8.   // Возвращаем две серединные точки, если в массиве нечётное количество элементов,
  9.   // то это одна и та же точка.
  10.   static int[] getMiddles(int left, int right) {
  11.     int mid_left = (left + right - 1) / 2;
  12.     int mid_right = (left + right) / 2;
  13.     return new int[] {mid_left, mid_right};
  14.   }
  15.  
  16.   static double findMedian(int[] a, int[] b)  {  
  17.     if (a.length > b.length)  {
  18.       int[] c = a;
  19.       a = b;
  20.       b = c;
  21.     }
  22.     int left_a = 0, left_b = 0, right_a = a.length, right_b = b.length;
  23.     int[] a_middles, b_middles;
  24.     while (true)  {
  25.       a_middles = getMiddles(left_a, right_a);
  26.       b_middles = getMiddles(left_b, right_b);
  27.       int offset = a_middles[0] - left_a;
  28.       if (offset == 0)  {   // осталось не больше 2-х элементов
  29.         break;
  30.       }
  31.       if (a[a_middles[0]] <= b[b_middles[0]] && b[b_middles[1]] <= a[a_middles[1]]) {
  32.         return (b[b_middles[0]] + b[b_middles[1]]) / 2.;
  33.       }
  34.       if (b[b_middles[0]] <= a[a_middles[0]] && a[a_middles[1]] <= b[b_middles[1]]) {
  35.         return (a[a_middles[0]] + a[a_middles[1]]) / 2.;
  36.       }
  37.       if (b[b_middles[1]] <= a[a_middles[1]]) {   // сдвигаем в a справа
  38.         right_a -= offset;
  39.         left_b += offset;
  40.       } else  {   // a[mid_a_left] < b[mid_b_left], сдвигаем в a слева
  41.         left_a += offset;
  42.         right_b -= offset;
  43.       }
  44.     }
  45.     // offset равен единице, если в b осталось больше 2-х элементов.
  46.     int offset = (left_b == b_middles[0]) ? 0 : 1;
  47.     int len_a = right_a - left_a;
  48.     int[] c = new int[len_a + b_middles[1] + 1 - b_middles[0] + 2*offset];
  49.     System.arraycopy(a, left_a, c, 0, len_a);
  50.     System.arraycopy(b, b_middles[0]-offset, c, len_a, c.length-len_a);
  51.     Arrays.sort(c);
  52.     int[] c_middles = getMiddles(0, c.length);
  53.     return (c[c_middles[0]] + c[c_middles[1]]) / 2.;
  54.   }
  55.  
  56.   public static void main(String[] args) throws IOException {
  57.     BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
  58.     reader.readLine();
  59.     reader.readLine();
  60.     String[] tokens = reader.readLine().trim().split(" ");
  61.     int[] a = new int[tokens.length];
  62.     for (int i=0; i<tokens.length; i++) {
  63.       a[i] = Integer.parseInt(tokens[i]);
  64.     }
  65.     tokens = reader.readLine().trim().split(" ");
  66.     int[] b = new int[tokens.length];
  67.     for (int i=0; i<tokens.length; i++) {
  68.       b[i] = Integer.parseInt(tokens[i]);
  69.     }
  70.     double result = findMedian(a, b);
  71.     System.out.println(result);
  72.   }
  73.  
  74. }
Add Comment
Please, Sign In to add comment