莫队求调
查看原帖
莫队求调
549499
Disjoint_cat楼主2022/9/29 21:48

rt,样例都过不了

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=50005,K=224;//K:块长
int n,nq,a[N],c[N],L,R,lst;
struct Q
{
	int l,r,id;
	ll ans,sum;
}q[N];
int k(int pos)
{
	return (int)ceil((double)pos/K);
}
bool cmp1(Q A,Q B)
{
	return k(A.l)<k(B.l)||(k(A.l)==k(B.l)&&A.r<B.r);
}
bool cmp2(Q A,Q B)
{
	return A.id<B.id;
}
ll gcd(ll a,ll b)
{
	return b?gcd(b,a%b):a;
}
int main()
{
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	cin>>n>>nq;
	for(int i=1;i<=n;i++)cin>>a[i];
	for(int i=1;i<=nq;i++){cin>>q[i].l>>q[i].r;q[i].id=i;}
	sort(q+1,q+nq+1,cmp1);
	for(int i=1;i<=n;i+=K)
	{
		L=1,R=0;memset(c,0,sizeof(c));
		for(int j=i;j<=min(i+K-1,n);j++)
		{
			if(q[j].l==q[j].r)
			{
				q[j].ans=0,q[j].sum=1;
				continue;
			}else lst=j-1;
			q[j].ans=(i==j?0:q[lst].ans);
			while(R<q[j].r)q[j].ans+=c[a[++R]]++;
			while(L<q[j].l)q[j].ans-=--c[a[L++]];
			while(L>q[j].l)q[j].ans+=c[a[--L]]++;
			q[j].sum=(ll)(q[j].r-q[j].l+1)*(q[j].r-q[j].l)/2;
			ll t=gcd(q[j].sum,q[j].ans);
			cout<<q[j].id<<":"<<q[j].ans<<"/"<<q[j].sum<<'\n';
			q[j].ans/=t,q[j].sum/=t;
		}
	}
	sort(q+1,q+nq+1,cmp2);
	for(int i=1;i<=nq;i++)cout<<q[i].ans<<'/'<<q[i].sum<<'\n';
	return 0;
}
2022/9/29 21:48
加载中...