Java模板
import java.io.*;
public class Main
{
public static int N = 100010;
public static int n;
public static int[] a = new int[N];
public static int[] t = new int[N];
public static void main(String[] args) throws IOException
{
StreamTokenizer in = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));
in.nextToken();
n = (int)in.nval;
for(int i = 0; i < n; i++)
{
in.nextToken();
a[i] = (int)in.nval;
}
merge(0, n - 1);
for(int i = 0; i < n; i++)
out.print(a[i] + " ");
out.flush();
}
public static void merge(int l, int r)
{
if(l >= r)
return;
int mid = l + r >> 1;
merge(l, mid);
merge(mid + 1, r);
int i = l, j = mid + 1, k = 0;
while(i <= mid && j <= r)
{
if(a[i] <= a[j])
t[k++] = a[i++];
else
t[k++] = a[j++];
}
while(i <= mid) t[k++] = a[i++];
while(j <= r) t[k++] = a[j++];
System.arraycopy(t, 0, a, l, k);
}
}
求逆序对数的应用
import java.io.*;
public class Main
{
public static int N = 100010;
public static int n;
public static long res;
public static int[] a = new int[N];
public static int[] t = new int[N];
public static void main(String[] args) throws IOException
{
StreamTokenizer in = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));
in.nextToken();
n = (int)in.nval;
for(int i = 0; i < n; i++)
{
in.nextToken();
a[i] = (int)in.nval;
}
merge(0, n - 1);
out.println(res);
out.flush();
}
public static void merge(int l, int r)
{
if(l >= r)
return;
int mid = l + r >> 1;
merge(l, mid);
merge(mid + 1, r);
int i = l, j = mid + 1, k = 0;
while(i <= mid && j <= r)
{
if(a[i] <= a[j])
t[k++] = a[i++];
else
{
t[k++] = a[j++];
res += mid - i + 1;
}
}
while(i <= mid) t[k++] = a[i++];
while(j <= r) t[k++] = a[j++];
System.arraycopy(t, 0, a, l, k);
}
}