题目
求所有子区间中不同元素之和。
分析
枚举相邻的相同数字形成的区间,计算它是哪些区间的子区间,每次有-1的贡献,将其从总贡献中减去。
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int maxn = 100000 + 10; int n; vector<int>a[maxn]; int limit; //出现过的最大值 int main() { scanf("%d", &n); for(int i = 1;i <= n;i++) { int tmp; scanf("%d", &tmp); a[tmp].push_back(i); if(tmp > limit) limit = tmp; } ll ans = 0; for(int i = 1;i <= n;i++) ans += 1LL * (n + 1 - i) * i; //总贡献 for(int i = 1;i <= limit;i++) { int pre = a[i][0]; for(int j = 1;j < a[i].size();j++) { if(pre == 1) ans -= (n - a[i][j] + 1); else if(a[i][j] == n) ans -= pre; else ans -= (1LL * pre * (n - a[i][j] + 1)); pre = a[i][j]; } } printf("%lld\n", ans); return 0; }
这里遍历了两遍,队友写的只遍历一遍,更加简短。https://ac.nowcoder.com/acm/contest/view-submission?submissionId=41082850