http://codeforces.com/contest/1004/problem/C
解题思路:真是好久没训练了,我被爆 int 卡了一上午
1.预处理找到数组中每个数的右边的不同数字的个数
2.从左往右遍历,每当遇到一个没出现过的数字就加上该数字右边不同数字的个数(不包括自己)
3.变量过程中获得不同数字的个数如果暴力加一层循环的话就超时(1e5的数据),所以才需要预处理
import java.util.HashSet;
import java.util.Scanner;
import java.util.Set;
public class Main {
public static void main(String args[]) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int[] num = new int[100010];
for(int i = 1;i <= n;i++) {
num[i] = sc.nextInt();
}
Set<Integer> fr = new HashSet<>();
int[] cntfr = new int[100010]; //对应数组的右边不同数字的个数
for(int i = n;i >= 1;i--) {
cntfr[i] = fr.size();
fr.add(num[i]);
}
long ans = 0; //喵的,爆int爆到头大,睡个午觉回来才A,早起真的傻一天
Set<Integer> have = new HashSet<>();
for(int i = 1;i < n;i++) {
if(have.contains(num[i])) //判断遍历的数字是否已经使用过(已遍历过)
continue;
ans += cntfr[i];
have.add(num[i]);
}
System.out.println(ans);
}
}