求解释(莫队答案都少了1)
查看原帖
求解释(莫队答案都少了1)
1284815
canwen楼主2025/1/13 21:08

不知道为啥我的莫队最终答案都得减一,然后还神秘 AC 了。

#include<bits/stdc++.h>
using namespace std;
#define int long long
inline int in(){
	char a = getchar();
	int k = 0, kk = 1;
	while(!isdigit(a)){
		if(a=='-') kk=-1;
		a=getchar();
	}
	while(isdigit(a)){
		k=(k<<3)+(k<<1)+a-'0', a= getchar();
	}
	return k*kk;
}
const int N = 5e4 + 5;
struct node{
	int l,r,p;
}e[N];
int cnt[N],kuai,L,R,n,m,k,a[N],ans,_ans[N];
bool cmp(node x,node y){
	return (x.l/kuai)==(y.l/kuai) ? x.r<y.r : x.l<y.l ;
}
void add(int pos){
	ans -= cnt[a[pos]]*cnt[a[pos]];
	cnt[a[pos]]++;
	ans += cnt[a[pos]]*cnt[a[pos]];
}
void del(int pos){
	ans -= cnt[a[pos]]*cnt[a[pos]];
	cnt[a[pos]]--;
	ans += cnt[a[pos]]*cnt[a[pos]];
}
signed main(){
	n=in(),m=in(),k=in();
	kuai = sqrt(n);
	for(int i=1;i<=n;i++) a[i] = in();
	for(int i=1;i<=m;i++){
		e[i].l = in(), e[i].r = in(), e[i].p = i;
	}
	sort(e+1,e+1+m,cmp);
	for(int i=1;i<=m;i++){
		int l = e[i].l, r = e[i].r, p = e[i].p;
		while(L<l) del(L++);
		while(L>l) add(--L);
		while(R>r) del(R--);
		while(R<r) add(++R);
		_ans[p] = ans; 
	}
	for(int i=1;i<=m;i++){
		cout << _ans[i]-1 << endl;// this
	}
	return 0;
}
2025/1/13 21:08
加载中...