萌新刚学OI,求助莫队
查看原帖
萌新刚学OI,求助莫队
287868
_Emiria_楼主2021/5/18 18:47
#include <cstdio>
#include <algorithm>

#define maxn 200005
#define maxa 1000000

int n, m, belong[500], a[maxn], cnt[maxa];

long long anss, ans[maxn];

struct Q{
	int l, r, id;
}q[maxn];

inline bool cmp(Q x, Q y){
	return belong[x.l] == belong[y.l] ? x.r < y.r : belong[x.l] < belong[y.l];
}

inline void add(int k){
	anss += cnt[a[k]]++ * 2 * a[k] + a[k];
	// printf("%d %d %d\n", a[k], cnt[a[k]], anss);
}

inline void sub(int k){
	anss -= cnt[a[k]]-- * 2 * a[k] - a[k];
}

int main(){
	scanf("%d %d", &n, &m);
	int block = sqrt((n<<1)/3);
	for(int i = 1; i <= n; i++){
		scanf("%d", &a[i]);
		belong[i] = (i - 1) / block + 1;
	}
	for(int i = 1; i <= m; i++){
		scanf("%d %d", &q[i].l, &q[i].r);
		q[i].id = i;
	}
	std :: sort(q + 1, q + m + 1, cmp);
	int lt = 1, rt = 0;
	for(int i = 1; i <= m; i++){
		while(lt < q[i].l) sub(lt++);
		while(lt > q[i].l) add(--lt);
		while(rt < q[i].r) add(++rt);
		while(rt > q[i].r) sub(rt--);
		ans[q[i].id] = anss;
	}
	for(int i = 1; i <= m; i++){
		printf("%lld\n", ans[i]);
	}
	return 0;
}

long long了阿,第六个点死了。

2021/5/18 18:47
加载中...