题意:
给你一个序列,求出这个序列的所有子序列,求出所有子序列的beauty值的和。
思路:
(貌似官方题解的思路更加简单明了)
两个变量,sum记录前面beauty值的总和,cnt记录总的路径数。
并且用map记录,map[a] = t,以a结尾的路径数为t。
当来到i位置,tmp = cnt+1-map[a[i]],便是到达a[i],且前面没有相同值的路径数;
计算以a[i]结尾,对sum的贡献值。
更新cnt、sum还有map即可。(具体可以看代码)
code:
#include <bits/stdc++.h>
using namespace std;
const int MOD = 1e9+7;
const int N = 1e5+5;
typedef long long LL;
int n;
int a[N];
map <int, int> mp;
void solve() {
mp.clear();
int sum = 0, cnt = 0;
for(int i = 1;i <= n; i++) {
int tmp = (cnt+1-mp[a[i]]+MOD)%MOD;
sum = (2*sum%MOD+1ll*tmp*a[i]%MOD)%MOD;
mp[a[i]] = (mp[a[i]]+cnt+1)%MOD;
cnt = (2*cnt+1)%MOD;
}
printf("%d\n", sum);
}
int main() {
int T;
scanf("%d", &T);
while(T--) {
scanf("%d", &n);
for(int i = 1;i <= n; i++)
scanf("%d", &a[i]);
solve();
}
return 0;
}