题目链接在这里:Problem - I - Codeforces
应该是一个比较经典的莫队题,一开始想的是这个数据范围肯定是要搞一个前缀和,后来发现如果弄前缀和的话区间还是不好操作,但是如果一位一位的算的话还是可以的,所以想到了莫队。
莫队要分块!!!不分块会T!
1 #include "bits/stdc++.h" 2 using namespace std; 3 typedef __int64 LL; 4 const int MAX=2e6+6; 5 LL n,t,a[MAX]; 6 LL L,R,ans[MAX],cnt[MAX]; 7 LL c[MAX]; 8 struct Node{ 9 LL l,r,no; 10 }stu[MAX]; 11 bool cmp(Node x,Node y){ 12 if (c[x.l]!=c[y.l]) return x.l<y.l; 13 return x.r<y.r; 14 } 15 int main(){ 16 freopen ("i.in","r",stdin); 17 freopen ("i.out","w",stdout); 18 LL i,j,an; 19 scanf("%I64d%I64d",&n,&t); 20 for (i=1;i<=n;i++) scanf("%I64d",a+i); 21 for (i=1,j=(LL)sqrt(n);i<=n;i++) c[i]=i/j; 22 for (i=1;i<=t;i++){ 23 scanf("%I64d%I64d",&stu[i].l,&stu[i].r); 24 stu[i].no=i; 25 } 26 sort(stu+1,stu+t+1,cmp); 27 L=1,R=an=0; 28 memset(cnt,0,sizeof(cnt)); 29 for (i=1;i<=t;i++){ 30 //cout<<stu[i].l<<' '<<stu[i].r<<endl; 31 while (R<stu[i].r){ 32 R++;an+=(cnt[a[R]]*2+1)*a[R]; 33 cnt[a[R]]++; 34 }//cout<<an<<" fuck"<<endl; 35 while (L>stu[i].l){ 36 L--;an+=(cnt[a[L]]*2+1)*a[L]; 37 cnt[a[L]]++; 38 } 39 while (R>stu[i].r){ 40 an-=((cnt[a[R]]-1)*2+1)*a[R]; 41 cnt[a[R]]--; 42 R--; 43 } 44 while (L<stu[i].l){ 45 an-=((cnt[a[L]]-1)*2+1)*a[L]; 46 cnt[a[L]]--; 47 L++; 48 } 49 ans[stu[i].no]=an; 50 } 51 for (i=1;i<=t;i++) printf("%I64d\n",ans[i]); 52 return 0; 53 }