萌新刚学莫队,70ptsTLE求条
查看原帖
萌新刚学莫队,70ptsTLE求条
982518
sjwhsss楼主2025/1/20 16:56
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn = 2e5+5;
int n , m , a[maxn] , L , R , bel[maxn];
ll t[maxn] , ans[maxn] , res , len[maxn];
struct qu{int l , r , id;}q[maxn];
bool cmp(qu x , qu y){return bel[x.l] == bel[y.l] ? bel[x.l] & 1 ? x.r < y.r : x.r > y.r : bel[x.l] < bel[y.l];}
void Add(int p){res+=t[a[p]]<<1,t[a[p]]++;return;}
void Del(int p){if (t[a[p]] >= 2)res-=t[a[p]]-1<<1; t[a[p]]--;return;}
inline ll read()
{
	ll x = 0;char ch=getchar();
	while(isdigit(ch) ^ 1)ch=getchar();
	while(isdigit(ch))x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
	return x;
}
ll Query(int l , int r)
{
	while(l < L)Add(--L);
	while(r > R)Add(++R);
	while(l > L)Del(L++);
	while(r < R)Del(R--);
	return res;
}
inline ll gcd(ll a , ll b){return b ? gcd(b , a % b) : a;}
void Print(ll a , ll b)
{
	if (b == 0) {puts("0/1");return;}
	int g = gcd(a , b);
	a/=g,b/=g;
	printf("%lld/%lld\n" , a , b);
	return;
}
int main ()
{
//	freopen("in.txt" , "r" , stdin);
//	freopen("out.txt" , "w" , stdout);
//	scanf("%d%d" , &n , &m);
	n = read() , m = read();
	int B = sqrt(n);
	for (int i = 1; i <= n; i++)a[i]=read(),bel[i]=(i - 1)*B+1;
	for (int i = 1; i <= m; i++)q[i].l=read(),q[i].r=read(),q[i].id=i,len[i]=q[i].r-q[i].l+1;
	sort(q + 1 , q + m + 1 , cmp);
//	return 0;
	for (; R <= n; R++)Add(R);
	L = 1;
//	return 0;
	for (int i = 1; i <= m; i++)
	{
		ans[q[i].id]=Query(q[i].l , q[i].r);
	}
	for (int i = 1; i <= m; i++)Print(ans[i] , len[i] * (len[i] - 1));
	return 0;
}
2025/1/20 16:56
加载中...