题目:给一段数组,求所有子串的total
思路:
遍历每个数字,根据贡献算法,左端点为当前数字的位置减去上一个同样数字出现的位置,右端点为n-i+1,每次的贡献为1,2,3.....n,当前i的贡献为l*(n-i+1)*(n-i+2)/2;
代码:
#include<bits/stdc++.h>
using namespace std;
#define int long long
void slove() {
int n; cin>>n;
vector<int> a(n+1);
for(int i=1;i<=n;i++) {
cin>>a[i];
}
int sum=0;
map<int,int> q;
for(int i=1;i<=n;i++) {
int pre=q.count(a[i]) ? q[a[i]]:0;
int l=i-pre;
sum+=l*(n-i+1)*(n-i+2)/2;
q[a[i]]=i;
}
cout<<sum<<endl;
}
signed main() {
int t; cin>>t;
while(t--) {
slove();
}
}

京公网安备 11010502036488号