CF1527C Sequence Pair Weight
题目大意:给定一个长度为\(n\)的序列\(a\),求\(\sum_{1\le l\lt r\le n}\sum_{l\le x\lt y\le r}[a_x=a_y]\),即求每个连续区间中相等数对个数之和。
思路:对于这种计数问题,如果直接求不好计算,一般求每个值对答案的贡献。
首先考虑对于\(a_i=a_j(i<j)\),那么其对答案产生的贡献就是\(i\times(n-j+1)\),那对于\(a_i=a_j=a_k(i<j<k)\),其对答案多产生的贡献显然是\((i+j)\times(n-k+1)\)
那么我们可以维护一个\(map\),
\(ans=\sum_{i=1}^nmap[a[i]]\times(n-i+1)\)
每次更新\(map[a[i]]+=i\)来维护前缀和
\(PS\):记得开\(longlong\)!!!
AC代码:
#include <bits/stdc++.h>
using namespace std;
const int N=1e5+10;
typedef long long ll;
int t,n,a[N];
map<ll,ll>cnt;
int main(){
cin>>t;
while(t--){
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
cnt.clear();
ll ans=0;
for(int i=1;i<=n;i++){
ans+=cnt[a[i]]*(n-i+1);
cnt[a[i]]+=i;
}
cout<<ans<<endl;
}
return 0;
}