关于下午 mx 我 A 的做法是否正确

学术版

ダ月 @ 2024-08-17 18:41:48

以前缀为例,我们依次枚举 1\sim n。我们算出前缀最大值和前缀最小值,然后算出公差,然后暴力检查这个前缀的合法性。(其中特判公差为 1)。

我通过了本题,问这做法复杂度是否正确。

int n;std::cin>>n;
    ve<int>v(n+1);
    for(int i=1;i<=n;i++)
        std::cin>>v[i];
    bool flg=true;
    for(int i=1;i<=n;i++)
        if(v[i]!=i){
            flg=false;
            break;
        }
    if(flg)return std::cout<<n-1<<'\n',void();
    int ans=0;
    int mn=1e9,mx=0,d=0;
    ve<int>pre(n+1),suf(n+1);
    ve<int>vis(n+1);
    for(int i=1;i<=n;i++){
        mx=std::max(mx,v[i]);
        mn=std::min(mn,v[i]);
        vis[v[i]]=true; 
        if(i>1&&(mx-mn)%(i-1)==0){
            int d=(mx-mn)/(i-1);
            if(d==1){pre[i]=true;continue;}
            bool flg=true;
            for(int k=mn;k<=mx;k+=d)
                if(!vis[k]){
                    flg=false;
                    break;
                }
            pre[i]=flg;
        }else if(i==1)pre[i]=true;
    }mn=1e9,mx=0;
    for(int i=1;i<=n;i++)vis[i]=0;
    for(int i=n;i>=1;i--){
        mx=std::max(mx,v[i]);
        mn=std::min(mn,v[i]);
        vis[v[i]]=true; 
        if(i<n&&(mx-mn)%(n-i)==0){
            int d=(mx-mn)/(n-i);
            if(d==1){suf[i]=true;continue;}
            bool flg=true;
            for(int k=mn;k<=mx;k+=d)
                if(!vis[k]){
                    flg=false;
                    break;
                }
            suf[i]=flg;
        }else if(i==n)suf[i]=true;
    }
    for(int i=1;i<n;i++)
        ans+=pre[i]&&suf[i+1];
    std::cout<<ans<<'\n';

by Nt_Tsumiki @ 2024-08-17 18:44:36

@ダ月 感觉不太对吧应该是可以卡成 n^2 的


by Nt_Tsumiki @ 2024-08-17 18:46:54

前奇后偶的一个就好像可以


by _H17_ @ 2024-08-17 18:55:42

@ダ月 公差只能是1,2


by GI录像机 @ 2024-08-17 18:56:09

2 4 6 8 10 12 这样好像就卡掉了


by _H17_ @ 2024-08-17 18:57:24

@GI录像机 1-n的排列吧哥们


by Nt_Tsumiki @ 2024-08-17 18:57:46

@GI录像机 但是排列啊


by min_inf @ 2024-08-17 19:07:48

哦好像是不太对,d=2就爆了


by GI录像机 @ 2024-08-17 19:27:13

@Nt_Tsumiki 你不能后面随便填上吗

也就是 (n/2)^2

@H17


by _H17_ @ 2024-08-17 19:31:25

@GI录像机 哦,对不起误解了


by ダ月 @ 2024-08-17 19:36:06

不清楚,反正是稀里糊涂地过了/yun


|