CF1004C Sonya and Robots(简单计数+STL)
CF1004C Sonya and Robots
题意:
给你\(n\)个数,从每一个数起向后找一个数,两个数组成一个数对,求\(n\)个数能有多少个不同的数对。
\(1 \le n\le1e5\)
思路:
对于计数需要去重。
假设数组\(sz_i\)表示第\(i+1\sim n\)个数中有多少个不同的数。
从前往后遍历
- 若一个数\(x\)还没出现过,则\(x\)对答案的贡献是\(sz_i\)
- 若一个数\(x\)在之前出现过了,则\(x\)对答案的贡献是\(0\),因为后面的数对在前面的\(x\)中已经计算过了。
\(sz\)数组可以用\(STL\)中的\(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;
}

浙公网安备 33010602011771号