分块新手,WA 求调
查看原帖
分块新手,WA 求调
461359
huangrenheluogu楼主2023/12/19 21:37
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N = 5e4 + 5, sqrtN = 3e2 + 5;
int n, m, a[N], to[N], S, L[sqrtN], R[sqrtN], f[sqrtN][N], cnt, g[sqrtN][sqrtN], sum[N], tot, l, r, ll, rr, ans, len, mot, GCD;
int vis[N];
inline int get(int L, int R, int col){
	return f[R][col] - f[L - 1][col];
}
signed main(){
	scanf("%lld%lld", &n, &m);
	for(int i = 1; i <= n; i++) scanf("%lld", &a[i]);
	S = sqrt(n);
	for(int i = 1; i <= n; i++){
		if(i % S == 1){
			to[i] = ++cnt;
			L[cnt] = R[cnt] = i;
		}
		else{
			R[to[i] = cnt] = i;
		}
	}
	for(int i = 1; i <= cnt; i++){
		for(int j = 1; j <= n; j++) f[i][j] = f[i - 1][j];
		for(int j = L[i]; j <= R[i]; j++){
			f[i][a[j]]++;
		}
	}
	for(int i = 1; i <= cnt; i++){
		tot = 0ll;
//		printf("in %lld\n", i);
		for(int j = 1; j <= n; j++) sum[j] = 0;
		for(int j = i; j <= cnt; j++){
			for(int k = L[j]; k <= R[j]; k++){
				tot += sum[a[k]];
				sum[a[k]]++;
			}
			g[i][j] = tot;
//			printf("g[%lld][%lld]=%lld\n", i, j, g[i][j]);
		}
	}
	while(m--){
		scanf("%lld%lld", &l, &r);
		if(l == r){
			printf("0/1\n");
			continue ;
		}
		mot = (r - l + 1) * (r - l) / 2;
//		printf("%lld\n", mot);
		ll = to[l];
		if(L[ll] < l) ll++;
		rr = to[r];
		if(R[rr] > r) rr--;
		ans = 0ll;
		if(ll <= rr) ans = g[ll][rr];
		for(int i = L[ll] - 1; i >= l; i--){
			ans += vis[a[i]];
			vis[a[i]]++;
//			printf("%lld\n", ans);
			ans += get(ll, rr, a[i]);
		}
		for(int i = R[rr] + 1; i <= r; i++){
			ans += vis[a[i]];
			vis[a[i]]++;
			ans += get(ll, rr, a[i]);
		}
		for(int i = L[ll] - 1; i >= l; i--) vis[a[i]] = 0;
		for(int i = R[rr] + 1; i <= r; i++) vis[a[i]] = 0;
		GCD = __gcd(ans, mot);
		ans /= GCD, mot /= GCD;
		printf("%lld/%lld\n", ans, mot);
	}
	return 0;
}
2023/12/19 21:37
加载中...