被卡常了(30pts求助)
查看原帖
被卡常了(30pts求助)
999274
CNS_5t0_0r2楼主2023/11/7 13:41
#include<bits/stdc++.h>
using namespace std;
int read() {
	char c = getchar();
	int x = 0, f = 1;
	while (c < '0' || c > '9') {
		if (c == '-')
			f = -1;
		c = getchar();
	}
	while (c >= '0' && c <= '9') {
		x = (x << 3) + (x << 1) + c - 48;
		c = getchar();
	}
	return x * f;
}
const int N = 5e4 + 9,SqrtN = 233;
int n,m;
int c[N],cnt[N];
struct queries{
	int l,r;
	int id;
} q[N];
int ans1[N],ans2[N];
int GCD(int x,int y){
	return y ? GCD(y,x % y) : x;
}
int lres = 1,rres;
struct blocks{
	int l,r,size;
} b[SqrtN];
int belong[N];
int block_cnt,block_len;
void build_block(){
	block_cnt = block_len = (int)sqrt(n);
	for(int i = 1;i <= block_cnt;i++){
		b[i].l = b[i - 1].r + 1;
		b[i].r = block_len * i;
		b[i].size = b[i].r - b[i].l + 1;
	}
	b[block_cnt].r = n;
	b[block_cnt].size = b[block_cnt].r - b[block_cnt].l + 1;
	for(int i = 1;i <= block_cnt;i++)
		for(int j = b[i].l;j <= b[i].r;j++)
			belong[j] = i;
}
bool cmp(queries q1,queries q2){
	return belong[q1.l] == belong[q2.l] ? belong[q1.r] < belong[q2.r] : belong[q1.l] < belong[q2.l];
}
int tmp;
int cal(int x){
	return (x * (x - 1)) >> 1;
}
void add(int x){
	tmp -= cal(cnt[c[x]]);
	cnt[c[x]]++;
	tmp += cal(cnt[c[x]]);
}
void del(int x){
	tmp -= cal(cnt[c[x]]);
	cnt[c[x]]--;
	tmp += cal(cnt[c[x]]);
}
int main(){
	n = read();m = read();
	for(int i = 1;i <= n;i++)
		c[i] = read();
	for(int i = 1;i <= m;i++){
		q[i].l = read();q[i].r = read();
		q[i].id = i;
	}
	sort(q + 1,q + m + 1,cmp);
	for(int i = 1;i <= m;i++){
		int L = q[i].l,R = q[i].r;
		while(lres > L)
			add(--lres);
		while(rres < R)
			add(++rres);
		while(lres < L)
			del(lres++);
		while(rres > R)
			del(rres--);
		ans1[q[i].id] = tmp;
		ans2[q[i].id] = cal(q[i].r - q[i].l + 1);
	}
	for(int i = 1;i <= m;i++){
		if(!ans1[i])
			printf("0/1\n");
		else
			printf("%d/%d\n",ans1[i] / GCD(ans1[i],ans2[i]),ans2[i] / GCD(ans1[i],ans2[i]));
	}
	return 0;
}
2023/11/7 13:41
加载中...