题目:给一段数组,求所有子串的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();
    }
}