JuRuoOIer @ 2024-02-18 21:55:16
判断是否在同一块中时,时刻注意每个循环变量存的是下标还是块编号。比如预处理每个区间的众数时,我写了:
for(int i=0;i<=bel[n-1];i++){
memset(t,0,sizeof(t));
mx=0;mxi=998244353;
for(int j=i;j<=bel[n-1];j++){
for(int k=j*len;bel[k]==bel[j];k++){
//difference ~~~~~~~~^^^^^^
t[a[k]]++;
if(t[a[k]]>mx||t[a[k]]==mx&&a[k]<mxi){
mx=t[a[k]];
mxi=a[k];
}
}
f[i][j]=mxi;
f[j][i]=mxi;
}
}
而正确的写法为:
for(int i=0;i<=bel[n-1];i++){
memset(t,0,sizeof(t));
mx=0;mxi=998244353;//偶然改成 998244353 后 RE 了发现问题
for(int j=i;j<=bel[n-1];j++){
for(int k=j*len;bel[k]==j;k++){
//difference ~~~~~~~~^
t[a[k]]++;
if(t[a[k]]>mx||t[a[k]]==mx&&a[k]<mxi){
mx=t[a[k]];
mxi=a[k];
}
}
f[i][j]=mxi;
f[j][i]=mxi;
}
}
当然很多问题都会导致 0 分,您很可能不是这的问题。