TLE莫队求改
查看原帖
TLE莫队求改
696431
lijunxi1楼主2024/1/26 10:30
#include <bits/stdc++.h>
using namespace std;
const int N=5e4+5;
int n,m,c[N],kc,kl[N],kr[N],kg,l,r,w[N],h1;
int a[N];
struct aa
{
	int l,r,ans1,ans2,time,k;
}qu[N];
bool cmp1(aa a,aa b)
{
	if(a.k==b.k)
	{
		if(a.k%2==1)
		{
			if(a.l==b.l)return a.r<b.r;
			return a.l<b.l;
		}
		else
		{
			if(a.l==b.l)return a.r>b.r;
			return a.l>b.l;
		}
	}
	return a.k<b.k;
 } 
 bool cmp2(aa a,aa b)
 {
 	return a.time<b.time;
 }
 void del()
 {
 	h1-=c[a[l]]*(c[a[l]]-1)/2;
 	c[a[l]]--;
 	h1+=c[a[l]]*(c[a[l]]-1)/2;
 	l++;
 }
 void der()
 {
 	h1-=c[a[r]]*(c[a[r]]-1)/2;
 	c[a[r]]--;
 	h1+=c[a[r]]*(c[a[r]]-1)/2;
 	r--;
 }
 void zjl()
 {
 	l--;
 	h1-=c[a[l]]*(c[a[l]]-1)/2;
 	c[a[l]]++;
 	h1+=c[a[l]]*(c[a[l]]-1)/2;
 }
 void zjr()
 {
 	r++;
 	h1-=c[a[r]]*(c[a[r]]-1)/2;
 	c[a[r]]++;
 	h1+=c[a[r]]*(c[a[r]]-1)/2;
 }
int main() {
	ios::sync_with_stdio(false);
	cin.tie(0);cout.tie(0);
	cin>>n>>m;
	for(int i=1;i<=n;i++)cin>>a[i];
	kc=sqrt(n);
	for(int i=1;i<=n;i=i+kc+1)
	{
		kl[++kg]=i;
		kr[kg]=min(i+kc,n);
		for(int j=kl[kg];j<=kr[kg];j++)w[j]=kg;
	}
	for(int i=1;i<=m;i++)
	{
		cin>>qu[i].l>>qu[i].r;
		qu[i].time=i;
		qu[i].k=w[qu[i].l];
	}
	sort(qu+1,qu+m+1,cmp1);
	l=r=1;
	h1=0;
	c[a[1]]=1;
	for(int i=1;i<=m;i++)
	{
		while(l<qu[i].l)del();
		while(l>qu[i].l)zjl();
		while(r<qu[i].r)zjr();
		while(r>qu[i].r)der();
		qu[i].ans1=h1;
		qu[i].ans2=qu[i].r-qu[i].l+1;
		
	}
	sort(qu+1,qu+m+1,cmp2);
	for(int i=1;i<=m;i++)
	{
		int x=qu[i].ans1,y=(qu[i].ans2-1)*qu[i].ans2/2;
		if(x==0)
		{
			cout<<"0/1\n";
		}
		else cout<<x/__gcd(x,y)<<"/"<<y/__gcd(x,y)<<"\n";
	}
}
2024/1/26 10:30
加载中...