莫队T了七个点
查看原帖
莫队T了七个点
389540
imfkwk楼主2021/3/24 23:46

求助,还有什么地方可以优化

#include <bits/stdc++.h>
#define int long long
#define N 50001
using namespace std;

inline void read(int& x)
{
	x = 0;
	int f = 1;

	char ch = getchar();
	while (ch < 48 || ch > 57)
	{
		if (ch == 45) f = -1;
		ch = getchar();
	}
	while (ch >= 48 && ch <= 57)
	{
		x = (x << 3) + (x << 1) + (ch ^ 48);
		ch = getchar();
	}

	x = x * f;
}

inline void write(int x)
{
	if (x < 0)
	{
		putchar(45);
		x = -x;
	}
	if (x > 9) write(x / 10);
	putchar(x % 10 + 48);
}

//////////////////////////////////////////////////

int n, m, kkk;
int L, R;
int a[N], block[N];
int cnt[N];

int sum;

inline int gcd(int a, int b)
{
	if (b == 0) return a;
	return gcd(b, a % b);
}

inline void add(int k)
{
	sum += (cnt[k]++ << 1);
}

inline void del(int k)
{
	sum -= (--cnt[k] << 1);
}

struct node
{
	int l;
	int r;
	int block;
	int id;

}q[N];

bool cmp(node a, node b)
{
	return (a.block == b.block) ? (a.block & 1) ? a.r > b.r : a.r < b.r : a.l < b.l;
}

int fz[N];
int fm[N];

signed main(void)
{
	read(n); read(m); kkk = n / sqrt(m * 2 / 3);
	
	for (register int i = 1; i <= n; ++i) read(a[i]);
	
	for (register int i = 1; i <= m; ++i)
	{
		read(q[i].l);
		read(q[i].r);
		q[i].block = i / kkk;
		q[i].id = i;
	}
	
	L = q[1].l; R = L - 1;
	
	for (register int i = 1; i <= m; ++i)
	{
		int x = q[i].l;
		int y = q[i].r;
		if (x == y) continue;
		
		while (L < x) del(a[L++]);
		while (L > x) add(a[--L]);
		while (R > y) del(a[R--]);
		while (R < y) add(a[++R]);
		
		fz[q[i].id] = sum;
		fm[q[i].id] = (R - L + 1) * (R - L);
	}
	
	for (register int i = 1; i <= m; ++i)
	{
		if (fz[i] == 0)
		{
			puts("0/1");
			continue;
		}
		int g = gcd(fm[i], fz[i]);
		printf("%lld / %lld\n", fz[i] / g, fm[i] / g);
	}
	
	return 0;
}
2021/3/24 23:46
加载中...