莫队调了好久,求助
查看原帖
莫队调了好久,求助
363006
wangyibo201026楼主2022/7/22 16:26

代码:

#include<bits/stdc++.h>
#define int long long

using namespace std;

const int N = 5e4 + 5;

int n, m, sum, size;
int color[N], tong[N];

struct Node{
	int l, r, id;
}a[N];

struct Node2{
	int _1, _2;
}ans[N];

bool cmp(Node x, Node y){
	if(x.l / size == y.l / size){
		return (x.l / size) & 1 ? x.r < y.r : x.r > y.r;
	}
	return x.l < y.l;
}


void add(int x){
  sum += tong[x];
  tong[x]++;
}

void del(int x){
  tong[x]--;
  sum -= tong[x];
}

signed main(){
	cin >> n >> m;
	size = sqrt(n);
	for(int i = 1; i <= n; i++){
		cin >> color[i];
	}
	for(int i = 1; i <= m; i++){
		cin >> a[i].l >> a[i].r;
		a[i].id = i;
	}
	sort(a + 1, a + 1 + m, cmp);
	int l = 1, r = 0;
	for(int i = 1; i <= m; i++){
		if(a[i].l == a[i].r){
			ans[a[i].id]._1 = 0;
			ans[a[i].id]._2 = 1;
			continue;
		}
		while(l > a[i].l){
			add(color[--l]);
		}
		while(r < a[i].r){
			add(color[++r]);
		}
		while(l < a[i].l){
			del(color[l++]);
		}
		while(r > a[i].r){
			del[color[r--]];
		}
		ans[a[i].id]._1 = sum;
		ans[a[i].id]._2 = (r - l + 1) * (r - l) / 2;
	}
	for(int i = 1; i <= m; i++){
		if(ans[i]._1){
			int k = __gcd(ans[i]._1, ans[i]._2);
			ans[i]._1 /= k;
			ans[i]._2 /= k; 
		}
		else{
			ans[i]._2 = 1;
		}
		cout << ans[i]._1 << "/" << ans[i]._2 << '\n';
	}
	return 0;
}
2022/7/22 16:26
加载中...