用c++完成这道题:题目描述 一个序列{an}的指标定义为其中相同元素对的数量,例如对序列{1, 2, 1, 1},其相同元素对为(1,3), (1,4), (3,4),括号里面是下标,因此其指标为3。 现给定一个n个数字组成的正整数序列{an},请你计算其所有区间里指标的和。 输入输出格式 输入格式: 第一行n 第二行n个正整数 输出格式: 一个数字,表示序列的所有区间指标的和 输入输出样例 输入样例1: 4 1 1 2 1 输出样例1: 6 样例1说明: {1, 1}指标1 {1, 2}指标0 {2, 1}指标0 {1,1,2}指标1 {1,2,1}指标1 {1,1,2,1}指标3 加起来一共6个指标。 测试点 共10个测试点,每个10分。 测试限制:每个测试点时间限制1s,内存限制128。 数据范围: 40%:n<=300, ai<=10^5 100%:n<=10^5, ai<=10^9
时间: 2024-03-21 15:43:24 浏览: 155
以下是用C++实现的代码,使用了前缀和来优化时间复杂度:
```
#include <iostream>
#include <unordered_map>
using namespace std;
const int N = 1e5 + 10;
int n;
int a[N], s[N];
unordered_map<int, int> cnt;
int main()
{
cin >> n;
for (int i = 1; i <= n; i ++ ) cin >> a[i];
long long res = 0;
for (int i = 1; i <= n; i ++ )
{
s[i] = s[i - 1] + cnt[a[i]];
cnt[a[i]] ++;
res += s[i];
}
cout << res << endl;
return 0;
}
```
这段代码使用了unordered_map来统计每个元素出现的次数,使用前缀和来计算每个区间内的指标和,最后将所有区间的指标和相加即可。时间复杂度为$O(n)$。
阅读全文