根据题目伪代码的意思,就是要求l和r上的前缀中不同元素个数的累加和,暴力的话会超时,所以在遍历的时候记录每个元素出现的位置,对于一个第一次出现的元素,对整个答案的贡献就为项数为n-该位置+1的等差数列的和,所以每个元素对答案的贡献就是该位置减去该元素第一个出现的位置和那个等差数列的乘积
#include <bits/stdc++.h>
using namespace std;
int main(){
int t;
cin>>t;
while(t--){
int n;
cin>>n;
map<int,int> mp;
long long ans=0;
for(int i=1;i<=n;i++){
int m;
cin>>m;
int c=i-mp[m];
long long s1=n+1-i;
long long s2=n+2-i;
ans+=c*s1*s2/2;
mp[m]=i;
}
cout<<ans<<endl;
}
}
using namespace std;
int main(){
int t;
cin>>t;
while(t--){
int n;
cin>>n;
map<int,int> mp;
long long ans=0;
for(int i=1;i<=n;i++){
int m;
cin>>m;
int c=i-mp[m];
long long s1=n+1-i;
long long s2=n+2-i;
ans+=c*s1*s2/2;
mp[m]=i;
}
cout<<ans<<endl;
}
}

京公网安备 11010502036488号