nodeee @ 2020-08-06 14:05:59
蒟蒻被卡70分,请教各位巨佬怎么样才能过QAQ
#include<bits/stdc++.h>
using namespace std;
int n,m;
int a[40005],li[40005];
int t;
int d[40][40][40005];
int len;
inline void init(){
register int kk=n/t;
for(int i=1;i<=n;i++){
int pos=(i-1)/kk+1;
d[pos][pos][a[i]]++;
}
for(register int i=1;i<=t;i++){
for(register int j=i+1;j<=t;j++){
for(register int k=1;k<=len;k++)d[i][j][k]=d[i][j-1][k]+d[j][j][k];
}
}
}
int ans=0,pos;
inline void query(int l,int r){
register int k=n/t;//每一段的长度
register int ed=((l-1)/k+1)*k;//左边末尾
register int st=(r-1)/k*k+1;//右边开始
if(st<ed)st=99999999,ed=r;//只有不到一段的情况
// cout<<ed<<" "<<st<<endl;
register int from=(l-1)/k+2,to=(r-1)/k;//首尾块编号
for(register int i=l;i<=ed;i++){
d[from][to][a[i]]++;
}
for(register int i=st;i<=r;i++){
d[from][to][a[i]]++;
}
for(register int i=1;i<=n;i++){
if(ans<d[from][to][i]){
ans=d[from][to][i],pos=i;
}
}
printf("%d\n",li[pos]);
for(register int i=l;i<=ed;i++){
d[from][to][a[i]]--;
}
for(register int i=st;i<=r;i++){
d[from][to][a[i]]--;
}
}
void lisan(){
sort(li+1,li+1+n);
len=unique(li+1,li+1+n)-li-1;
for(register int i=1;i<=n;i++){
a[i]=lower_bound(li+1,li+len+1,a[i])-li;
}
}
int main(){
scanf("%d%d",&n,&m);
for(register int i=1;i<=n;i++){
scanf("%d",&a[i]);
li[i]=a[i];
}
lisan();//离散化
t=pow(n,1.0/3);//T按照蓝书上取N^(1/3)
init();
register int l,r;
for(register int i=1;i<=m;i++){
scanf("%d%d",&l,&r);
l=(l+li[pos]-1)%n+1,r=(r+li[pos]-1)%n+1;
if(l>r)swap(l,r);
ans=0;
query(l,r);
}
return 0;
}
by dead_X @ 2020-08-06 14:06:49
快读,O2,调参
by chenxia25 @ 2020-08-06 14:14:12
卡常。
by 夏色祭Official @ 2020-08-06 14:18:09
那就写
by Minecraft_serpartick @ 2020-08-06 14:26:32
卡常呗
by wangjinbo @ 2020-08-06 14:29:12
把一个弱智莫队题强制在线。。。
https://www.luogu.com.cn/blog/asadashino/moqueue 这东西可能有用
by nodeee @ 2020-08-07 10:32:44
感谢各位,解决了。
query里面应该