求一个序列所有区间(区间内不同数的个数)的和

求一个序列所有区间(区间内不同数的个数)的和

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

转载于:https://www.cnblogs.com/fanshhh/p/11333158.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值