• [cf86D]Powerful array


    Description

    给定一个长度为n的数组,t次查询,求\(\sum_{i=l}^{r}a_i*s_{a_i}^2\)。其中,\(s_k\)\(k\)在区间\([l,r]\)出现的次数。

    Solution

    莫队裸题。

    #include<bits/stdc++.h>
    using namespace std;
    
    typedef long long ll;
    const int N=200005,K=1000005;
    struct query{
    	int l,r,n;
    }q[N];
    int a[N],s[K],f[N],n,m,t;
    ll ans[N];
    bool cmp(query a,query b){
    	if(f[a.l]!=f[b.l]) return f[a.l]<f[b.l];
    	return a.r<b.r;
    }
    ll add(int i){
    	++s[a[i]];
    	return 1ll*a[i]*((s[a[i]]<<1)-1);
    }
    ll remove(int i){
    	--s[a[i]];
    	return 1ll*a[i]*(s[a[i]]<<1|1);
    }
    int main(){
    	scanf("%d%d",&n,&t);
    	for(int i=1;i<=n;++i)
    		scanf("%d",&a[i]);
    	for(int i=1;i<=t;++i){
    		scanf("%d%d",&q[i].l,&q[i].r);
    		q[i].n=i;
    	}
    	m=sqrt(n);
    	for(int i=1,k=1;i<=n;++k)
    		for(int j=1;i<=n&&j<=m;++i,++j)
    			f[i]=k;
    	sort(q+1,q+1+t,cmp);
    	int l=1,r=1;
    	ll tmp=1ll*a[1];
    	++s[a[1]];
    	for(int i=1;i<=t;++i){
    		while(r<q[i].r){
    			++r;tmp+=add(r);
    		}
    		while(r>q[i].r){
    			tmp-=remove(r);--r;
    		}
    		while(l>q[i].l){
    			--l;tmp+=add(l);
    		}
    		while(l<q[i].l){
    			tmp-=remove(l);++l;
    		}
    		ans[q[i].n]=tmp;
    	}
    	for(int i=1;i<=t;++i)
    		printf("%lld\n",ans[i]);
    	return 0;
    }
  • 相关阅读:
    行人检测
    异步推理SSD
    道路分割
    NATS_13:NATS Streaming案例讲解
    csv模块
    头部姿态评估
    行人属性
    图像、视频读取显示及操作
    natspy
    openvino_yoloV3
  • 原文地址:https://www.cnblogs.com/AireenYe/p/cf86D.html
Copyright © 2020-2023  润新知