70pts TLE求调
查看原帖
70pts TLE求调
1384818
HeYuChenC楼主2024/12/15 08:43
#include<bits/stdc++.h>
using namespace std;
long long a[50005], cnt[50005], ans[50005], sum = 0, ans1[50005];
int n, m, b;
struct Q {
	int l = -1, r = -1, id = -1, bl;
	bool operator < (Q a) {
		return (bl ^ a.bl) ? bl < a.bl : ((bl & 1) ? r < a.r : r > a.r);
	}
} q[50005];
void add(long long x) {
	sum += cnt[x] * 2 + 1;
	++cnt[x];
}
void del(long long x) {
	sum -= cnt[x] * 2 - 1;
	--cnt[x];
}
int main() {
	memset(cnt, 0, sizeof(cnt));
	scanf("%d%d", &n, &m);
	b = sqrt(n * n / m * 1.0);
	for (int i = 1; i <= n; i++) scanf("%lld", &a[i]);
	for (int i = 1; i <= m; i++) {
		scanf("%d%d", &q[i].l, &q[i].r);
		q[i].id = i;
		q[i].bl = q[i].l / b;
	}
	sort(q + 1, q + m + 1);
	for (int k = 1, i = 1, j = 0; k <= m; k++) {
		while (j < q[k].r) add(a[++j]);
		while (i > q[k].l) add(a[--i]);
		while (j > q[k].r) del(a[j--]);
		while (i < q[k].l) del(a[i++]);
		if (i == j) {
			ans[q[k].id] = 0;
			ans1[q[k].id] = 1;
		} else {
			ans[q[k].id] = sum - (j - i + 1);
			ans1[q[k].id] = 1ll * (j - i + 1) * (j - i);
			long long g = __gcd(ans[q[k].id], ans1[q[k].id]);
			ans[q[k].id] /= g;
			ans1[q[k].id] /= g;
		}
	}
	for (int i = 1; i <= m; i++) printf("%lld/%lld\n", ans[i], ans1[i]);
	return 0;
}

各种优化都试过了(包括快读,奇偶性等)

但还是TLE #7-9

求Dalao帮助

2024/12/15 08:43
加载中...