挺有意思的一题,就当积累一下吧。
做法
枚举i和k会超时,那就只枚举j。
#include<bits/stdc++.h>
using namespace std;
int n;
int a[300010];
vector<int> v[300010];
int main(){
scanf("%d",&n);
map<int,int> mp;//数的种类
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
v[a[i]].push_back(i);//存下标
mp[a[i]]++;
}
long long ans=0;
for(map<int,int>::iterator it=mp.begin();it!=mp.end();it++){
for(int i=1;i<v[it->first].size();i++){
ans+=1ll*(v[it->first][i]-v[it->first][i-1]-1)*i*(v[it->first].size()-i);
//(v[it->first][i]-v[it->first][i-1]-1)是不同的j,i是在a[j]前面a[i]的个数,(v[it->first].size()-i)是在a[j]前面a[i]的个数
}
}
cout<<ans<<endl;
}