1 #include <bits/stdc++.h> 2 #define nmax 50010 3 4 using namespace std; 5 int a[nmax],ta[nmax],cnt[nmax]={0}; 6 int n,m,qn,k; 7 struct que{ 8 int l,r,p,id; 9 bool operator < (const que& x) const{ return (x.p==p)?(x.r>r):(x.p>p); } 10 }q[nmax]; 11 12 int main(){ 13 scanf("%d%d%d",&n,&qn,&k); 14 m=sqrt(n); 15 for (int i=1; i<=n; i++) scanf("%d",&a[i]); 16 for (int i=1; i<=qn; i++) { 17 scanf("%d%d",&q[i].l,&q[i].r); 18 q[i].p=(q[i].l-1)/m; 19 q[i].id=i; 20 } 21 sort(q+1,q+qn+1); 22 int l=q[1].l,r=q[1].l-1,ans=0; 23 for (int i=1; i<=qn; i++) { 24 while(l>q[i].l) l--,ans+=(2*cnt[a[l]]+1),cnt[a[l]]++; 25 while(r<q[i].r) r++,ans+=(2*cnt[a[r]]+1),cnt[a[r]]++; 26 while(l<q[i].l) ans-=(2*cnt[a[l]]-1),cnt[a[l]]--,l++; 27 while(r>q[i].r) ans-=(2*cnt[a[r]]-1),cnt[a[r]]--,r--; 28 ta[q[i].id]=ans; 29 } 30 for (int i=1; i<=qn; i++) printf("%d\n",ta[i]); 31 return 0; 32 }
原文:https://www.cnblogs.com/jiecaoer/p/11332677.html