求助莫队T飞(卡常/指出错误)
查看原帖
求助莫队T飞(卡常/指出错误)
483317
ATZdhjeb楼主2023/2/28 12:39

RT,昨天调了一中午,然后还是T10个点。。

代码:

#include <bits/stdc++.h>

using namespace std;

inline int input() {
	register int x = 0,f = 1;
	register char c = getchar();
	while (c < '0' || c > '9') {
		if (c == '-') f = -1;
		c = getchar();
	}
	while (c <= '9' && c >= '0') {
		x = (x << 3) + (x << 1) + (c ^ 48);
		c = getchar();
	}
	return x * f;
}

int n,m,a[50010],vis[50010],ans = 0,blo,son[50010],mom[50010];

struct Query {
	int l;
	int r;
	int idx;
	bool operator < (const Query& b) const {
		return l / blo == b.l / blo ?  (r == b.r ? false : (l / blo & 1) ^ (r < b.r)) : l < b.l;
	}
}q[50010];

int gcd(const int& n,const int& m) {
	return m ? gcd(m,n % m) : n;
}

inline int add(const int& u) {
	ans += vis[a[u]];
	++vis[a[u]];
}

inline int del(const int& u) {
	--vis[a[u]];
	ans -= vis[a[u]];
}

int main() {
//	freopen("P1494_1.in","r",stdin);
//	freopen("P1494.out","w",stdout);
	n = input();
	m = input();
	blo = sqrt(n);
	for (register int i = 1; i <= n; ++i) a[i] = input();
	for (register int i = 1; i <= m; ++i) {
		q[i].l = input();
		q[i].r = input();
		q[i].idx = i;
	}
	sort(q + 1,q + m + 1);
	int l = q[1].l,r = l;
	add(q[1].l);
	for (register int i = 1; i <= m; ++i) if (q[i].l == q[i].r) {
		son[q[i].idx] = 0;
		mom[q[i].idx] = 1;
	} else {
//		cout << q[i].l << ',' << q[i].r << endl;
		while (l > q[i].l) add(--l);
		while (r < q[i].r) add(++r);
		while (l < q[i].l) del(l++);
		while (r > q[i].r) del(r--);
		mom[q[i].idx] = (r - l) % 2 ? (r - l + 1) / 2 * (r - l) : (r - l) / 2 * (r - l + 1);
		if (ans == 0) {
			son[q[i].idx] = 0;
			mom[q[i].idx] = 1;
		} else {
			int k = gcd(mom[q[i].idx],ans);
			mom[q[i].idx] /= k;
			son[q[i].idx] = ans / k;
		}
	}
	for (register int i = 1; i <= m; ++i) printf("%d/%d\n",son[i],mom[i]);
	return 0;
}

提交记录

2023/2/28 12:39
加载中...