在区间[i,j]内,元素a[x]对答案的贡献,为a[x]*(2*x-i-j)。
然后通过一堆迷之前缀操作,就能得到答案了。。。
//#include <bits/stdc++.h>
#include<stdio.h>
#include<queue>
#include<cstring>
#include<iostream>
using namespace std;
void read(unsigned int&a){
char ch;while(!((ch=getchar())>='0')&&(ch<='9'));
a=ch-'0';while(((ch=getchar())>='0')&&(ch<='9'))a*=10,a+=ch-'0';
}
const int MAXN=1000100;
unsigned int a[MAXN],num[MAXN],qnum[MAXN],tnum[MAXN],tqnum[MAXN];
int main()
{
unsigned int i,n,setnow,qnow,ans;
while(~scanf("%u",&n))
{
memset(num,0,sizeof(num));
memset(tnum,0,sizeof(tnum));
memset(qnum,0,sizeof(qnum));
memset(tqnum,0,sizeof(tqnum));
for(i=1;i<=n;i++)
{
read(a[i]);
num[a[i]]++;
qnum[a[i]]+=i;
}
setnow=0;
qnow=0;
ans=0;
for(i=1;i<=n;i++)
{
setnow-=tnum[a[i]]*(num[a[i]]-tnum[a[i]]);
qnow-=tnum[a[i]]*(qnum[a[i]]-tqnum[a[i]])+(num[a[i]]-tnum[a[i]])*tqnum[a[i]];
tnum[a[i]]++;
tqnum[a[i]]+=i;
setnow+=tnum[a[i]]*(num[a[i]]-tnum[a[i]]+1);
qnow+=tnum[a[i]]*(qnum[a[i]]-tqnum[a[i]]+i)+(num[a[i]]-tnum[a[i]]+1)*tqnum[a[i]];
ans+=((i<<1)*setnow-qnow)*a[i];
setnow-=tnum[a[i]];
qnow-=i*tnum[a[i]]+tqnum[a[i]];
}
printf("%u\n",ans);
}
}