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;
}
posted @ 2020-07-12 21:50  Qquun  阅读(51)  评论(0)    收藏  举报