社区讨论

莫队块大小为1……

P1494[国家集训队] 小 Z 的袜子参与者 7已保存回复 6

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
6 条
当前快照
1 份
快照标识符
@mi6xvmau
此快照首次捕获于
2025/11/20 12:36
4 个月前
此快照最后确认于
2025/11/20 12:36
4 个月前
查看原帖
CPP
#include<bits/stdc++.h>
#define ll long long
#define N 500005
using namespace std;
struct heihei{
	int l, r, id;
}q[N];
int a[N], n, m;
short sum[N], bel[N];
ll ansA[N], ansB[N], A, B;
inline char cmp(heihei x, heihei y){
	if(bel[x.l] == bel[y.l]) return !(bel[x.l]&1)? (x.r > y.r):(x.r < y.r);
	return x.l < y.l;
}
inline char gc()//用fread把读入加速到极致,具体我也不懂,背板子就好
{
    static char BB[1000000],*S=BB,*T=BB;
    return S==T&&(T=(S=BB)+fread(BB,1,1000000,stdin),S==T)?EOF:*S++;
}
inline int read()//getchar换成fread的快读
{
    register int x=0;register char ch=gc();
    for(;ch<48;)ch=gc();
    for(;ch>=48;)x=x*10+(ch^48),ch=gc();
    return x;
}
char hei[30];
inline void putout(ll x){
	if(!x){putchar(48);return;}
	register char l = 0;
	for(;x;) hei[++ l] = x % 10, x /= 10;
	for(;l;) putchar(hei[l --] + 48);
}
inline ll gcd(ll x, ll y){
	return !y ? x : gcd(y, x % y);
}
int main(){
//	freopen("testdata.in","r",stdin);
	n = read(), m = read();
	register int i, blo = 1;
	for(i = 1; i <= n; i ++) a[i] = read();
	for(i = 1; i <= n; i ++) bel[i] = (i + blo - 1) / blo;
	for(i = 1; i <= m; i ++) q[i].l = read(), q[i].r = read(), q[i].id = i;
	sort(q + 1, q + 1 + m, cmp);
	 int l = 1, r = 1, ans = 0; sum[a[l]] ++;
	for(i = 1; i <= m ; i++){
		for(;l < q[i].l;) ans -= 2 * sum[a[l]] - 2,-- sum[a[l]],++ l ;  
		for(;r < q[i].r;) ++ r, ans += 2 * sum[a[r]],++ sum[a[r]] ;
		for(;l > q[i].l;) -- l, ans += 2 * sum[a[l]],++ sum[a[l]] ;
		for(;r > q[i].r;) ans -= 2 * sum[a[r]] - 2,-- sum[a[r]] ,-- r ;
		A = ans, B = (q[i].r - q[i].l + 1);
		B = B * (B - 1);
		if(A && B){
			ll d = gcd(A, B);
			ansA[q[i].id] = A / d;
			ansB[q[i].id] = B / d;
		}
		else{
			ansA[q[i].id] = 0;
			ansB[q[i].id] = 1;
		}
	}
	for(i=1;i<=m;i++)putout(ansA[i]),putchar('/'),putout(ansB[i]),putchar(10);
	return 0;
}
嘿嘿嘿

回复

6 条回复,欢迎继续交流。

正在加载回复...