求一個序列所有區間(區間內不同數的個數)的和
鏈接:https://ac.nowcoder.com/acm/contest/888/B
來源:牛客網
Gromah and LZR have entered the second level. There is a sequence a1,a2,⋯ ,an on the wall.
There is also a note board saying "the beauty value of a sequence is the number of different elements in the sequence".
LZR soon comes up with the password of this level, which is the sum of the beauty values of all successive subintervals of the sequence on the wall.
Please help them determine the password!
輸入描述:
The first line contains one positive integer nn_{}n, denoting the length of the sequence.
The second line contains nn_{}n positive integers a1,a2,⋯ ,ana_1, a_2, \cdots, a_na1,a2,⋯,an, denoting the sequence.
1 ≤ \(a_i\) ≤ n ≤ \(10^5\)
輸出描述:
Print a non-negative integer in a single line, denoting the answer.示例1
輸入
4
1 2 1 3
輸出
18
說明
The beauty values of subintervals [1,1],[2,2],[3,3],[4,4] are all 1.
The beauty values of subintervals [1,2],[1,3],[2,3],[3,4] are all 2.
The beauty values of subintervals [1,4],[2,4] are all 3.
As a result, the sum of all beauty values are 1×4+2×4+3×2=18
題意
求一個序列所有區間(區間內不同數的個數)的和
題解
遞推,記錄\(a_i\)出現的位置,如果\(a_i\)以前出現的位置是cnt[\(a_i\)],那么區間[L, i]和[L, i-1](0<L<=cnt[\(a_i\)])的結果是一樣的,[L, i]比[L,i-1](cnt[\(a_i\)] < L <= i)多1,因為在這些區間,\(a_i\)屬於不同的數。
#include <cstdio>
int cnt[100010];
int main() {
int n, a;
scanf("%d", &n);
long long sum[100010], ans = 0;
sum[0] = 0;
for(int i = 1; i <= n; i++) {
scanf("%d", &a);
sum[i] = sum[i-1] + (i - cnt[a]);
cnt[a] = i;
ans += sum[i];
}
printf("%lld\n", ans);
return 0;
}