社区讨论
莫队块大小为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 条回复,欢迎继续交流。
正在加载回复...