题目链接: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; }