莫队模板求调
查看原帖
莫队模板求调
285617
黑影洞人楼主2022/9/3 15:23
#include<cstdio>
#include<algorithm>
#include<cmath>
#define N 114514
using namespace std;
int n,m,l=1,r=0;
int ansx[N],ansy[N],a[N],pos[N],block,cnt[N],x,y;
struct question{
	int l,r,id;
	bool operator<(const question &a)const{
		return pos[l]==pos[a.l]?r<a.r:pos[l]<pos[a.l];
	}
}q[N];
void add(int x){
	cnt[a[x]]++;
	if(cnt[a[x]]>1)x+=2*(cnt[a[x]]-1);
}
void del(int x){
	cnt[a[x]]--;
	if(cnt[a[x]]>0)x-=2*cnt[a[x]];
}
signed main(){
	scanf("%d%d",&n,&m);
	block=sqrt(n);
	for(int i=1;i<=n;i++){
		scanf("%d",&a[i]);
		pos[i]=i/block;
	}
	for(int i=1;i<=m;i++){
		scanf("%d%d",&q[i].l,&q[i].r);
		q[i].id=i;
	}
	sort(q+1,q+m+1);
	for(int i=2;i<=m;i++){
		while(q[i].l<l)add(--l);
		while(q[i].r>r)add(++r);
		while(q[i].l>l)del(l++);
		while(q[i].r<r)del(r--);
		if(q[i].l==q[i].r){
			ansx[q[i].id]=0;
			ansy[q[i].id]=1;
			continue;
		}
		y=(q[i].r-q[i].l+1)*(q[i].r-q[i].l);
		int d=__gcd(x,y);
		x/=d,y/=d;
		ansx[q[i].id]=x;
		ansy[q[i].id]=y;
	}
	for(int i=1;i<=m;i++)printf("%d/%d\n",ansx[i],ansy[i]);
	return 0;
}
2022/9/3 15:23
加载中...