1 #include<iostream>
2 #include<cstdio>
3 #include<algorithm>
4 #include<cstring>
5 #include<set>
6 using namespace std;
7
8 int a[100005];
9 int rd[100005];
10
11 int main()
12 {
13 set<int>s;
14 int n;
15 cin>>n;
16 for(int i=1;i<=n;i++)
17 scanf("%d",&a[i]);
18
19 for(int i=n;i>=1;i--)
20 {
21 s.insert(a[i]);
22 rd[i]=s.size(); //预处理:记录 下标大于等于i并且不重复的a[i]的'数目'
23 }
24 s.clear();
25
26 long long sum=0; //int会爆
27 for(int i=1;i<=n;i++)
28 {
29 if(s.find(a[i]) == s.end() ) //如果还没有出现过a[i];
30 {
31 s.insert(a[i]); //那就加入a[i];
32 sum+= rd[i+1]; //加上 下标在i之后(不包括i)的不重复的a[i] 数量
33 } //最后一个 rd[n+1]=0 默认等于0
34 }
35 cout<<sum<<endl;
36 }
http://codeforces.com/group/1EzrFFyOc0/contest/1004/problem/C
1 #include<iostream>
2 #include<cstdio>
3 #include<algorithm>
4 #include<cstring>
5 #define ll long long
6 using namespace std;
7
8 const int maxn=1e5+5;
9 int a[maxn];
10 int rd[maxn];
11 bool vis[maxn];
12
13 int main()
14 {
15 int n;
16 cin>>n;
17 for(int i=1;i<=n;i++)
18 scanf("%d",&a[i]);
19
20 for(int i=n;i>=1;i--)
21 {
22 rd[i]=rd[i+1]; //继承
23 if( !vis[a[i]] )
24 {
25 vis[a[i]]=1;
26 rd[i]++;
27 }
28 }
29 memset(vis,0,sizeof(vis));
30 ll sum=0;
31 for(int i=1;i<=n;i++)
32 {
33 if( !vis[a[i]] )
34 {
35 sum += rd[i+1];
36 vis[a[i]]=1;
37 }
38 }
39 cout<<sum<<endl;
40 }