CodeForces - 86D Powerful array (莫队)

题链:https://vjudge.net/problem/CodeForces-86D

思路:与luogu P2709 小B的询问一个题,只不过加了乘s。

#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int N = 2e5+10;
const int M = 1e6+10;
int n,t,a[N],belong[N],base;
struct node{
	int l,r,id;
}q[N];
int num[M];
ll ans[N],sum=0;
bool cmp(node a,node b){
	return (belong[a.l]^belong[b.l])?belong[a.l]<belong[b.l]:(belong[a.l]&1)?a.r<b.r:a.r>b.r;
}
void add(int x){
	sum+=(num[a[x]]<<1|1)*a[x];
	++num[a[x]];
}
void del(int x){
	--num[a[x]];
	sum-=(num[a[x]]<<1|1)*a[x];
}
int main(void){
	scanf("%d%d",&n,&t);
	base=ceil(sqrt(1.0*n));
	for(int i=1;i<=n;i++)
		scanf("%d",&a[i]),belong[i]= i/base;
	for(int i=1;i<=t;i++)
		scanf("%d%d",&q[i].l,&q[i].r),q[i].id=i;
	sort(q+1,q+1+t,cmp);
	int l=1,r=0;
	for(int i=1;i<=t;i++){
		int ql=q[i].l,qr=q[i].r;
		while(l<ql) del(l++); 
		while(l>ql) add(--l); 
		while(r<qr) add(++r); 
		while(r>qr) del(r--); 
		ans[q[i].id]=sum;
	}
	for(int i=1;i<=t;i++)
		printf("%I64d\n",ans[i]);	
	return 0;	
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值