Ew_Cors @ 2022-10-02 20:04:59
RT,不知道是什么原因只过了三个点涅,剩余都是 WA,时间很宽裕!
代码如下:
#include<bits/stdc++.h>
using namespace std;
int n,m,a[40005],b[40005];
int l[205],r[205],cob,lob;
int s[205][40005],c[205][205];
int tmp[40005];
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>a[i];
b[i]=a[i];
}
sort(b+1,b+n+1);
int ctmp=unique(b+1,b+n+1)-b-1;
for(int i=1;i<=n;i++)
a[i]=lower_bound(b+1,b+ctmp+1,a[i])-b;
lob=floor(sqrt(n));
for(;r[cob]<n;cob++)
l[cob+1]=cob*lob+1,
r[cob+1]=(cob+1)*lob;
cob--;
r[cob]=n;
for(int i=1;i<=cob;i++){
for(int j=1;j<=n;j++)
s[i][j]=s[i-1][j];
for(int j=l[i];j<=r[i];j++)
s[i][a[j]]++;
}
for(int i=1;i<=cob;i++){
int id=0;
for(int j=i;j<=cob;j++){
for(int k=l[j];k<=r[j];k++){
tmp[a[k]]++;
if(tmp[a[k]]>tmp[id]
||(tmp[a[k]]==tmp[id] && a[k]<id))
id=a[k];
}
c[i][j]=id;
}
memset(tmp,0,sizeof tmp);
}
for(int i=1,L,R,lst=0;i<=m;i++){
cin>>L>>R;
L=(L-1+lst)%n+1,R=(R-1+lst)%n+1;
if(L>R)swap(L,R);
int lb=(L-1)/lob+1,rb=(R-1)/lob+1;
int id=0;
if(rb-lb<=1){
for(int k=L;k<=R;k++){
tmp[a[k]]++;
if(tmp[a[k]]>tmp[id]
||(tmp[a[k]]==tmp[id] && a[k]<id))
id=a[k];
}
for(int k=L;k<=R;k++)
tmp[a[k]]=0;
}
else{
for(int k=L;k<=r[lb];k++){
if(!tmp[a[k]])
tmp[a[k]]=s[rb-1][a[k]]-s[lb][a[k]];
tmp[a[k]]++;
if(tmp[a[k]]>tmp[id]
||(tmp[a[k]]==tmp[id] && a[k]<id))
id=a[k];
}
for(int k=l[rb];k<=R;k++){
if(!tmp[a[k]])
tmp[a[k]]=s[rb-1][a[k]]-s[lb][a[k]];
tmp[a[k]]++;
if(tmp[a[k]]>tmp[id]
||(tmp[a[k]]==tmp[id] && a[k]<id))
id=a[k];
}
int clr=c[lb+1][rb-1];
if(!tmp[clr])tmp[clr]=s[rb-1][clr]-s[lb][clr];
if(tmp[clr]>tmp[id]
||(tmp[clr]==tmp[id] && clr<id))
id=clr;
tmp[clr]=0;
for(int k=L;k<=r[lb];k++)
tmp[a[k]]=0;
for(int k=l[rb];k<=R;k++)
tmp[a[k]]=0;
}
cout<<(lst=b[id])<<endl;
}
return 0;
}
by Ew_Cors @ 2022-10-02 20:15:46
怎么没有人帮我吹!!!!!!!!!!!!!!!!!!
by Ew_Cors @ 2022-10-02 20:22:38
没事了,块数量多减了一。