刚学分块求调,样例过,WA 0 pts

P4168 [Violet] 蒲公英

zhlzt @ 2024-07-23 19:19:37

#include<bits/stdc++.h>
using namespace std;
#define low lower_bound
const int maxn=4e4+10;
const int maxm=40;
int belong[maxn],uni[maxn];
int sta[maxm],fin[maxm];
int book[maxn],w[maxn];
int cnt[maxm][maxm][maxn],dp[maxm][maxm];
int query(int l,int r){
    int pl=belong[l],pr=belong[r];
    int ans=dp[pl+1][pr-1];
    int app=cnt[pl+1][pr-1][ans];
    if(pl==pr){
        for(int i=l;i<=r;i++){
            cnt[pl+1][pr-1][uni[i]]++;
            if(cnt[pl+1][pr-1][uni[i]]>app){
                ans=uni[i];
                app=cnt[pl+1][pr-1][uni[i]]+1;
            }
            else if(cnt[pl+1][pr-1][uni[i]]==app){
                if(uni[i]<ans) ans=uni[i];
            }
        }
        for(int i=l;i<=r;i++){
            cnt[pl+1][pr-1][uni[i]]--;
        }
    } else {
        for(int i=l;i<=fin[pl];i++){
            cnt[pl+1][pr-1][uni[i]]++;
            if(cnt[pl+1][pr-1][uni[i]]>app){
                ans=uni[i];
                app=cnt[pl+1][pr-1][uni[i]];
            }
            else if(cnt[pl+1][pr-1][uni[i]]==app){
                if(uni[i]<ans) ans=uni[i];
            }
        }
        for(int i=sta[pr];i<=r;i++){
            cnt[pl+1][pr-1][uni[i]]++;
            if(cnt[pl+1][pr-1][uni[i]]>app){
                ans=uni[i];
                app=cnt[pl+1][pr-1][uni[i]];
            }
            else if(cnt[pl+1][pr-1][uni[i]]==app){
                if(uni[i]<ans) ans=uni[i];
            }
        }
        for(int i=l;i<=fin[pl];i++){
            cnt[pl+1][pr-1][uni[i]]--;
        }
        for(int i=sta[pr];i<=r;i++){
            cnt[pl+1][pr-1][uni[i]]--;
        }
    }
    return ans;
}
int main(){
    ios::sync_with_stdio(0);
    cin.tie(0); cout.tie(0);
    int n;cin>>n; int m;cin>>m;
    for(int i=1;i<=n;i++) cin>>w[i];
    for(int i=1;i<=n;i++) book[i]=w[i];
    sort(book+1,book+1+n);
    int pos=unique(book+1,book+1+n)-book-1;
    for(int i=1;i<=n;i++){
        uni[i]=low(book+1,book+1+pos,w[i])-book;
    }
    int len=(int)pow(1.0*n,1.0/3*2);
    for(int i=1;i<=n;i++){
        belong[i]=(i+len-1)/len; 
    }
    int tot=belong[n];
    for(int i=1;i<=tot;i++){
        sta[i]=len*(i-1)+1; fin[i]=min(n,len*i);
    }
    for(int i=1;i<=tot;i++){
        for(int j=i;j<=tot;j++){
            for(int k=sta[i];k<=fin[j];k++){
                cnt[i][j][uni[k]]++;
            }
            for(int k=1;k<=pos;k++){
                int pre=dp[i][j];
                if(cnt[i][j][k]>cnt[i][j][pre]) dp[i][j]=k;
            }
        }
    }
    int last=0;
    for(int t=1;t<=m;t++){
        int l,r;cin>>l>>r;
        l=(l+last-1)%n+1; r=(r+last-1)%n+1;
        if(l>r) swap(l,r);
        last=book[query(l,r)];
        cout<<last<<'\n';
    }
    return 0;
}

by Fish_ht @ 2024-07-23 19:30:26

@zhlzt 直接在原数组离散化


by zhlzt @ 2024-07-23 19:33:55

@Fish_ht 所以为什么?


by Fish_ht @ 2024-07-23 19:37:31

@zhlzt 因为你求的就是离散化后的下标


by zhlzt @ 2024-07-23 19:38:19

@Fish_ht 所以我为什么会挂?


by zhlzt @ 2024-07-23 19:41:16

@Fish_ht 在吗?对不起打扰您了。


by zhlzt @ 2024-07-23 19:44:16

还请巨佬解答一下。


by Fish_ht @ 2024-07-23 19:46:44

@zhlzt 在


|