10pts求条 (莫队)
查看原帖
10pts求条 (莫队)
891956
TempestMiku楼主2023/6/5 19:12

·看·看·我·的·

//[L,R]
//(a*(a-1))+(b*(b-1))+(c*(c-1))+.../(r-l+1)*(r-l)
// a^2-a + b^2-b + c^2-c +...
// a^2+b^2+c^2-(r-l+1)
#include<bits/stdc++.h>
#define int long long
using namespace std;
inline int read(){
	int f(1),x(0);
	char ch=getchar();
	for(;!isdigit(ch);ch=getchar()) if(ch=='-') f=-1;
	for(;isdigit(ch);ch=getchar()) x=(x<<1)+(x<<3)+(ch^48);
	return f*x;
}
inline void write(int x){
	if(x<0) x=-x,putchar('-');
	if(x>9) write(x/10);
	putchar(x%10+'0');
	return ;
}
const int N=51145;
int n,m,a[N],pos[N],cnt[N],ANS(0),ans[N],t;
struct node{
	int l,r,k;
} q[N];
//inline bool operator <(const node &a,const node &b){
inline bool cmp(node a,node b){
	if(pos[a.l]!=pos[b.l]){
		return pos[a.l]<pos[b.l];
	}
	if(pos[a.l]&1) return pos[a.r]>pos[b.r];
	return pos[a.r]<pos[b.r];
}
inline bool USAO(node a,node b){
	return a.k<b.k;
}
inline void add(int x){ 
	ANS-=(cnt[x]*cnt[x]); 
	cnt[x]++; 
	ANS+=(cnt[x]*cnt[x]); 
} 
inline void del(int x){	
	ANS-=(cnt[x]*cnt[x]);
	cnt[x]--;
	ANS+=(cnt[x]*cnt[x]);
}
signed main(){
	n=read(),m=read();
	t=sqrt(n);
	for(register int i=1;i<=n;i++){
		a[i]=read();
		pos[i]=(i-1)/t+1;
	}
	for(register int i=1;i<=m;i++){
		q[i].l=read(),q[i].r=read(),q[i].k=i;
	}
	sort(q+1,q+1+m,cmp);
	int L=1,R=0;
	for(register int i=1;i<=m;i++){
		while(L<q[i].l) del(a[L++]);
		while(R>q[i].r) del(a[R--]);
		while(L>q[i].l) add(a[--L]);
		while(R<q[i].r) add(a[++R]);
		ans[q[i].k]=ANS;
	}

	sort(q+1,q+m+1,USAO);
	for(register int i=1;i<=m;i++){
		int A=ans[i]-(q[i].r-q[i].l+1),B=(q[i].r-q[i].l+1)*(q[i].r-q[i].l);
		int gcd=__gcd(A,B);
		A/=gcd,B/=gcd;	
		write(A),putchar('/'),write(B),puts("");
	}
	return 0;
}

OJ上能过 但是luogu 10分呜呜呜求条∩

2023/6/5 19:12
加载中...