Codeforces Round #495 (Div. 2)-C. Sonya and Robots

題意:題目描述其實蠻複雜,反正就是找給出的序列裏有多少組不同的<ai,aj>(i<j),a[i]和a[j]可以相同。

題解:超級簡單,只需要從後往前統計到每個位置爲止有多少種不同的數,最後再從前往後遍歷一次,對於每個不同的ai只需要找後面有多少個不同的bi就行了,也就是加上他後面不同的數的個數。

附上代碼:

#include<bits/stdc++.h>
typedef long long ll;
using namespace std;


const int maxn=100010;
int a[maxn];
int cnt[maxn];
int vis[maxn];


int main()
{
    int n;
    scanf("%d",&n);
    for(int i=1; i<=n; i++)
        scanf("%d",&a[i]);//輸入每個數
    memset(vis,0,sizeof(vis));
    memset(cnt,0,sizeof(cnt));
    for(int i=n; i>=1; i--) //倒着統計每個位置有多少種的數
    {
        cnt[i]=cnt[i+1];
        if( !vis[a[i]] )
        {
            vis[a[i]]=1;
            cnt[i]++;
        }
    }
    memset(vis,0,sizeof(vis));
    ll sum=0;
    for(int i=1; i<=n; i++)
    {
        if( !vis[a[i]] )
        {
            sum += cnt[i+1];
            vis[a[i]]=1;
        }
    }
    printf("%lld\n",sum);
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章