萌新刚学莫队1ms求助
查看原帖
萌新刚学莫队1ms求助
214172
wpy233楼主2023/1/16 11:59

为什么我家莫队跑这么慢,开-O2最大点1.1s

求助大佬QAQ

#include <bits/stdc++.h>
using namespace std;
#define ll long long
inline ll read()
{
	char ch;
	ll x=0,f=1;
	for(;!isdigit(ch);ch=getchar())
		if(ch=='-')
			f=-1;
	for(; isdigit(ch);ch=getchar())
		x*=10,x+=(ch-'0');
	return x*f;	
}
int n,sq;
int a[50005];
int Q,k;
struct QAQ{
	int l;
	int r;
	int id;
}q[50005];
bool comp(QAQ x,QAQ y)
{
	int xl=x.l/sq,yl=x.l/sq;
	if(xl!=yl) return xl<yl;
	if(xl&1) return x.r<y.r;
	return x.r>y.r;
}
ll cnt[50005],cur,l=1,r;
ll ans[50005];
inline void add(int p)
{
	cur+=(2*cnt[a[p]]+1);
	cnt[a[p]]++;
}
inline void del(int p)
{
	cnt[a[p]]--;
	cur-=(2*cnt[a[p]]+1);
}
int main()
{
	n=read();
	Q=read();
	k=read();
	sq=sqrt(n);
	for(int i=1;i<=n;i++) a[i]=read();
	for(int i=1;i<=Q;i++)
	{
		q[i].l=read();
		q[i].r=read();
		q[i].id=i;
	}
	sort(q+1,q+Q+1,comp);
	for(int i=1;i<=Q;i++)
	{
		while(l>q[i].l) add(--l);
		while(r<q[i].r) add(++r);
		while(l<q[i].l) del(l++);
		while(r>q[i].r) del(r--);
		ans[q[i].id]=cur;
	}
	for(int i=1;i<=Q;i++)
		printf("%lld\n",ans[i]);
	return 0;
}
2023/1/16 11:59
加载中...