2019牛客暑期多校训练营(第八场)Beauty Values(思维
https://ac.nowcoder.com/acm/contest/888/B
求数组中所有子区间内不同元素的种类的和。
我们不难想到,对于每一个数字在每一个子区间最大贡献为1,当重复出现某一个元素时候,只需要从前面最近的一个相同的元素(位置为j)算起就行( j - i + 1) * (n - j + 1),故统计每个数的区间,可以由左右端点集合构成答案,遍历即可。
#include<bits/stdc++.h>
#define endl '\n'
#define IOS ios::sync_with_stdio(0)
#define N 100006
using namespace std;
int main() {
int n;
IOS;
while (cin >> n) {
vector<int> a[N];
for (int i = 1; i <= n; ++i) {
int t;
cin >> t;
a[t].push_back(i);
}
ll ans = 0;
for (int i = 1; i <= 100000; ++i) {
if (!a[i].size()) {
continue;
}
ll sum = 0;
for (auto j :a[i]) {
ans += (j - sum) * (n - j + 1);
sum = j;
}
}
cout << ans << endl;
}
return 0;
}
优质内容筛选与推荐>>