题目连接

https://ac.nowcoder.com/acm/contest/7226/B

解题思路

先统计下所有珠子。
二维遍历左端点和右端点,遍历右端点的时候判断统计不同颜色珠子的个数,每遍历到一个右端点ans就加上不同的珠子数,遍历左端点时cnt置零。
cnt数组的生存周期与每个左端点是相同的,cnt[i]表示此时左端点开始的区间颜色为i的珠子的个数,只要统计过这个颜色,就不再让w+1了。
不是特别好讲,希望你能理解什么意思。这个方法在统计一段内不同种类有多少比较好用。

AC代码

#include<bits/stdc++.h>
using namespace std;
int main(){
    int n,ans=0;
    int cnt[1010],a[1010];
    cin>>n;
    for(int i=1;i<=n;i++) cin>>a[i];
    for(int i=1;i<=n;i++){
        fill(cnt+1,cnt+1001,0);
        for(int j=i,w=0;j<=n;j++) w+=(++cnt[a[j]]==1),ans+=w;
    }
    cout<<ans<<endl;
}