链接:https://ac.nowcoder.com/acm/contest/92662/C
来源:牛客网
题目描述
小红拿到了一个数组,她有若干次询问,每次询问一个前缀内有多少对相同的数。你能帮帮她吗?
如果存在i,j,1≤i<j≤n,且ai=aj,那么(ai,aj)就是一对相同的数对。只要下标不同,就是不同的数对。
输入描述:
第一行输入一个正整数n,代表数组大小。
第二行输入n个正整数ai代表小红拿到的数组。1≤n≤100000;1≤ai≤1000000000
输出描述:
输出n个整数,第i个整数代表前缀[1,i]内有多少对相同的数。
示例1
输入
6
2 3 3 3 1 2
输出
0 0 1 3 3 4
说明
对于前缀 [2],没有相同的数。
对于前缀 [2,3],没有相同的数。
对于前缀 [2,3,3],有1对相同的数。
对于前缀 [2,3,3,3],有3对相同的数。
对于前缀 [2,3,3,3,1],有3对相同的数。
对于前缀 [2,3,3,3,1,2],有4对相同的数。
#include<bits/stdc++.h>
using namespace std;
int main() {
int n;
cin >> n;
unordered_map<int, int> count; //ai最大1e9 用数组count[ai]会爆内存 段错误
long long b = 0; // 使用 long long 防止溢出
for (int i = 1; i <= n; i++) {
int x;
cin >> x;
count[x]++;
b += count[x] - 1;
cout << b << ' ';// 计算相同数对的数量
}
return 0;
}