题目:Sonya and Robots

题目链接:https://vjudge.net/problem/CodeForces-1004C

题目大意:

给出n个数,要求找出含有多少对不同的(x , y)  其中 x  在 y 的左边(给出的数组的相对位置)。

思路:

可以用一个数组 b 来存储 x 后面不同数的个数,再用一个map来记录 x 是否已经被使用,中途需要开ll,加和可能爆int。

解题代码:

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cmath>
#include <string>
#include <cstring>
#include <map>
#include <set>
using namespace std;
const long long N = 1e9 + 7;
typedef long long ll;
map<ll,ll> ma;
set<ll> s;
ll a[100010],b[100010];
int main()
{
    int n;
    ll sum = 0;
    cin >> n;
    for(int i = 0;i < n ;i++ )
    {
        cin >> a[i];
    }
    for(int i = n-1;i >= 0;i--)
    {
        b[i] = s.size();   //记录a[i]后面又多少个不相等的数
        s.insert(a[i]);

    }
    for(int i = 0;i < n;i++)
    {
        if(ma[a[i]] == 0)   //证明这个数在之前没被使用
            sum += b[i];
        ma[a[i]] = 1;  //记录a[i] 已经使用
    }
    cout << sum << endl;
    return 0;
}