Advertisement
Guest User

Untitled

a guest
Jun 11th, 2012
134
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 2.81 KB | None | 0 0
  1. import java.io.*;
  2. import java.util.*;
  3. import static java.lang.Math.*;
  4.  
  5. public class E implements Runnable {
  6.  
  7.     final boolean ONLINE_JUDGE = System.getProperty("ONLINE_JUDGE") != null;
  8.    
  9.     BufferedReader in;
  10.     PrintWriter out;
  11.     StringTokenizer tok;
  12.  
  13.     public static void main(String[] args) {
  14.         new Thread(null, new E(), "", 256 * (1L << 20)).start();
  15.     }
  16.  
  17.     @Override
  18.     public void run() {
  19.         try {
  20.             long startTime = System.currentTimeMillis();
  21.             in = new BufferedReader(new FileReader("input.txt"));
  22.             out = new PrintWriter("output.txt");
  23.             Locale.setDefault(Locale.US);
  24.             tok = new StringTokenizer("");
  25.             solve();
  26.             in.close();
  27.             out.close();
  28.             long freeMemory = Runtime.getRuntime().freeMemory();
  29.             long totalMemory = Runtime.getRuntime().totalMemory();
  30.             long endTime = System.currentTimeMillis();
  31.             System.err.println("Time = " + (endTime - startTime));
  32.             System.err.println("Memory = " + ((totalMemory - freeMemory) >> 10));
  33.         } catch (Throwable t) {
  34.             t.printStackTrace(System.err);
  35.             System.exit(-1);
  36.         }
  37.     }
  38.  
  39.     String readString() throws IOException {
  40.         while (!tok.hasMoreTokens()) {
  41.             tok = new StringTokenizer(in.readLine());
  42.         }
  43.         return tok.nextToken();
  44.     }
  45.  
  46.     int readInt() throws IOException {
  47.         return Integer.parseInt(readString());
  48.     }
  49.  
  50.     long readLong() throws IOException {
  51.         return Long.parseLong(readString());
  52.     }
  53.  
  54.     double readDouble() throws IOException {
  55.         return Double.parseDouble(readString());
  56.     }
  57.    
  58.     void debug(Object... o) {
  59.         if (!ONLINE_JUDGE) {
  60.             System.err.println(Arrays.deepToString(o));
  61.         }
  62.     }
  63.  
  64.     // solution
  65.    
  66.     void solve() throws IOException {
  67.         int n = readInt();
  68.         int[] a = new int[n];
  69.         for (int i = 0; i < n; i++) {
  70.             a[i] = readInt();
  71.         }
  72.         int[] initial = a.clone();
  73.         long best = mergesort(a, 0, n-1);
  74.         Map<Integer, Integer> map = new HashMap<Integer, Integer>();
  75.         for (int i = 0; i < n; i++) {
  76.             map.put(a[i], i+1);
  77.         }
  78.         long ans = best;
  79.         for (int i = 0; i < n; i++) {
  80.             int num = map.get(initial[i]);
  81.             ans -= num-1;
  82.             ans += n-num;
  83.             best = min(best, ans);
  84.         }
  85.         out.println(best);
  86.     }
  87.  
  88.     private long mergesort(int[] a, int L, int R) {
  89.         if (L >= R) {
  90.             return 0;
  91.         }
  92.         int m = (L + R) / 2;
  93.         return mergesort(a, L, m) + mergesort(a, m+1, R) + merge(a, L, m, R);
  94.     }
  95.  
  96.     private long merge(int[] a, int L, int m, int R) {
  97.         int len1 = m - L + 1;
  98.         int len2 = R - m;
  99.         int[] first = new int[len1+1]; first[len1] = Integer.MAX_VALUE;
  100.         int[] second = new int[len2+1]; second[len2] = Integer.MAX_VALUE;
  101.         System.arraycopy(a, L, first, 0, len1);
  102.         System.arraycopy(a, m+1, second, 0, len2);
  103.         long ans = 0;
  104.         for (int i = 0, j = 0, k = L; k <= R; k++) {
  105.             if (first[i] < second[j]) {
  106.                 a[k] = first[i];
  107.                 i++;
  108.             } else {
  109.                 a[k] = second[j];
  110.                 j++;
  111.                 ans += len1 - i;
  112.             }
  113.         }
  114.         return ans;
  115.     }
  116.  
  117. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement