2019牛客多校第八场 B Beauty Values
题意:给你一串数字,求出每个连续字串中有多少个不同的数字。
闲话:今天全天不在状态(19年不再碰KFC了),幸好队友给力,我只想到了一点点东西,就突然A掉了。这题比赛的时候推了半天没弄明白,晚上看队友的代码有了一点理解。写在这里。
题解:一个递推的思维。记录每个值对多少个区间有贡献,当重复出现的时候,就减掉贡献,相当于抹去了其贡献,加入了新的贡献。最后加在一起。答案就出来了。
代码:
#include<cstdio>
#include<string>
#include<algorithm>
#include<iostream>
#include<string.h>
using namespace std;
const int mx = 1e5 + 5;
int a[mx];
typedef long long ll;
ll pre[mx], ha[mx];
int main() {
int n;
cin >> n;
memset(pre, 0, sizeof(pre));
memset(ha, 0, sizeof(ha));
for (int i = 1; i <= n; i++)
cin >> a[i];
pre[0] = 0;
ll ans= 0;
for (int i = 1; i <= n; i++) {
pre[i] = pre[i - 1] + i - ha[a[i]]; //减去贡献
ha[a[i]] = i; //记录能影响的区间
ans += pre[i]; //加上每个区间的值
}
cout << ans << endl;
return 0;
}