按照蓝书O(N^(5/3))算法,被卡70分求助

P4168 [Violet] 蒲公英

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

那就写 O(n^{3/2})


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里面应该 O(N^{\frac{1}{3}}) 就可以解决的东西我愣是用暴力 O(N) 跑QAQ


|