- 思路
记录每个数对应升序的下标,记录每个数先将数据离散化。
倒着插入每个数,计算该位置前的已经插入的数。
import java.util.Arrays;
import java.util.Scanner;
public class Main_POJ2299 {
static long[] sum = new long[500005];
static node2299[] node = new node2299[500005];
static int[] id = new int[500005];
static int n;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while(!sc.hasNext("0")) {
n = sc.nextInt();
Arrays.fill(sum, 0);
Arrays.fill(node, null);
for(int i=1;i<=n;i++) {
node[i] = new node2299(sc.nextLong(),i);
}
Arrays.sort(node,1,n+1);
for(int i=1;i<=n;i++) {
id[node[i].i] = i;
}
long ans = 0;
for(int i=n;i>=1;i--) {
ans += get(id[i]-1);
update(id[i],1);
}
System.out.println(ans);
}
}
public static void update(int x,int d) {
for(int i=x;i<=n;i+=i&(-i)) {
sum[i] += d;
}
}
public static int get(int x) {
int ans = 0;
for(int i=x;i>=1;i-=i&(-i)) {
ans += sum[i];
}
return ans;
}
}
class node2299 implements Comparable<node2299>{
long a;
int i;
public node2299(long a,int i) {
this.a = a;
this.i = i;
}
public int compareTo(node2299 o) {
return (int)(this.a-o.a);
}
}