CodeForces 86D Powerful array(莫队算法)

Posted 新博客↓

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CodeForces 86D Powerful array(莫队算法)相关的知识,希望对你有一定的参考价值。

BZOJ2038差不多。。复习一下。

 1 #include<cstdio>
 2 #include<cmath>
 3 #include<algorithm>
 4 using namespace std;
 5 int block;
 6 struct Query{
 7     int i,l,r;
 8     bool operator<(const Query &q)const{
 9         if(l/block==q.l/block) return r<q.r;
10         return l/block<q.l/block;
11     }
12 }query[220000];
13 int cnt[1111111];
14 long long res,ans[220000];
15 void insert(long long x){
16     res-=x*cnt[x]*cnt[x];
17     ++cnt[x];
18     res+=x*cnt[x]*cnt[x];
19 }
20 void remove(long long x){
21     res-=x*cnt[x]*cnt[x];
22     --cnt[x];
23     res+=x*cnt[x]*cnt[x];
24 }
25 int a[220000];
26 int main(){
27     int n,t;
28     scanf("%d%d",&n,&t);
29     for(int i=1; i<=n; ++i) scanf("%d",a+i);
30     block=(int)sqrt(n);
31     for(int i=0; i<t; ++i){
32         query[i].i=i;
33         scanf("%d%d",&query[i].l,&query[i].r);
34     }
35     sort(query,query+t);
36     int l=1,r=1; cnt[a[1]]=1; res=a[1];
37     for(int i=0; i<t; ++i){
38         while(l<query[i].l) remove(a[l++]);
39         while(l>query[i].l) insert(a[--l]);
40         while(r>query[i].r) remove(a[r--]);
41         while(r<query[i].r) insert(a[++r]);
42         ans[query[i].i]=res;
43     }
44     for(int i=0; i<t; ++i){
45         printf("%I64d\\n",ans[i]);
46     }
47     return 0;
48 }

 

以上是关于CodeForces 86D Powerful array(莫队算法)的主要内容,如果未能解决你的问题,请参考以下文章

CodeForces - 86D Powerful array (莫队)

Codeforces 86D Powerful array(莫队)

Powerful array CodeForces - 86D (莫队算法)

Powerful array CodeForces - 86D

Powerful array CodeForces - 86D(莫队)

「CF86D」Powerful array 解题报告