题目连接
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; }