Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import java.io.*;
- import java.util.*;
- import static java.lang.Math.*;
- public class E implements Runnable {
- final boolean ONLINE_JUDGE = System.getProperty("ONLINE_JUDGE") != null;
- BufferedReader in;
- PrintWriter out;
- StringTokenizer tok;
- public static void main(String[] args) {
- new Thread(null, new E(), "", 256 * (1L << 20)).start();
- }
- @Override
- public void run() {
- try {
- long startTime = System.currentTimeMillis();
- in = new BufferedReader(new FileReader("input.txt"));
- out = new PrintWriter("output.txt");
- Locale.setDefault(Locale.US);
- tok = new StringTokenizer("");
- solve();
- in.close();
- out.close();
- long freeMemory = Runtime.getRuntime().freeMemory();
- long totalMemory = Runtime.getRuntime().totalMemory();
- long endTime = System.currentTimeMillis();
- System.err.println("Time = " + (endTime - startTime));
- System.err.println("Memory = " + ((totalMemory - freeMemory) >> 10));
- } catch (Throwable t) {
- t.printStackTrace(System.err);
- System.exit(-1);
- }
- }
- String readString() throws IOException {
- while (!tok.hasMoreTokens()) {
- tok = new StringTokenizer(in.readLine());
- }
- return tok.nextToken();
- }
- int readInt() throws IOException {
- return Integer.parseInt(readString());
- }
- long readLong() throws IOException {
- return Long.parseLong(readString());
- }
- double readDouble() throws IOException {
- return Double.parseDouble(readString());
- }
- void debug(Object... o) {
- if (!ONLINE_JUDGE) {
- System.err.println(Arrays.deepToString(o));
- }
- }
- // solution
- void solve() throws IOException {
- int n = readInt();
- int[] a = new int[n];
- for (int i = 0; i < n; i++) {
- a[i] = readInt();
- }
- int[] initial = a.clone();
- long best = mergesort(a, 0, n-1);
- Map<Integer, Integer> map = new HashMap<Integer, Integer>();
- for (int i = 0; i < n; i++) {
- map.put(a[i], i+1);
- }
- long ans = best;
- for (int i = 0; i < n; i++) {
- int num = map.get(initial[i]);
- ans -= num-1;
- ans += n-num;
- best = min(best, ans);
- }
- out.println(best);
- }
- private long mergesort(int[] a, int L, int R) {
- if (L >= R) {
- return 0;
- }
- int m = (L + R) / 2;
- return mergesort(a, L, m) + mergesort(a, m+1, R) + merge(a, L, m, R);
- }
- private long merge(int[] a, int L, int m, int R) {
- int len1 = m - L + 1;
- int len2 = R - m;
- int[] first = new int[len1+1]; first[len1] = Integer.MAX_VALUE;
- int[] second = new int[len2+1]; second[len2] = Integer.MAX_VALUE;
- System.arraycopy(a, L, first, 0, len1);
- System.arraycopy(a, m+1, second, 0, len2);
- long ans = 0;
- for (int i = 0, j = 0, k = L; k <= R; k++) {
- if (first[i] < second[j]) {
- a[k] = first[i];
- i++;
- } else {
- a[k] = second[j];
- j++;
- ans += len1 - i;
- }
- }
- return ans;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement