CF1004C Sonya and Robots
题意:
给你
n
n
n个数,从每一个数起向后找一个数,两个数组成一个数对,求
n
n
n个数能有多少个不同的数对。
1
≤
n
≤
1
e
5
1 \le n\le1e5
1≤n≤1e5
思路:
对于计数需要去重。
假设数组
s
z
i
sz_i
szi表示第
i
+
1
∼
n
i+1\sim n
i+1∼n个数中有多少个不同的数。
从前往后遍历
- 若一个数 x x x还没出现过,则 x x x对答案的贡献是 s z i sz_i szi
- 若一个数 x x x在之前出现过了,则 x x x对答案的贡献是 0 0 0,因为后面的数对在前面的 x x x中已经计算过了。
s z sz sz数组可以用 S T L STL STL中的 s e t set set逆序遍历求得。
Code:
int q[N];
int sz[N];
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
int n;
cin>>n;
rep(i,1,n){
cin>>q[i];
}
set<int>Q;
map<int,int>mp;
ll ans=0;
dep(i,n,1){
sz[i]=Q.size();//不同数的个数
Q.insert(q[i]);
}
rep(i,1,n){
if(mp[q[i]]==0){
ans+=sz[i];//第一次出现
}
mp[q[i]]++;
}
cout<<ans;
return 0;
}