1 条题解

  • 0
    @ 2026-9-30 12:32:07

    C++ :

    
    #include <cstdio>
    #include <cstdlib>
    /* 值 v 的位置 -> pos[v]。走法固定(每次 +D),故沿链预处理
       「从 v 一路走到本链末端的总代价」suf[v] = cost(v,v+D) + suf[v+D],
       一次询问 L->R 的代价就是 suf[L]-suf[R]。 */
    static int ar[90005], ac[90005];
    static long long suf[90005];
    int main(){
        int H,W;
        long long D;
        if(scanf("%d %d %lld",&H,&W,&D)!=3) return 0;
        int N=H*W;
        for(int i=1;i<=H;i++)
            for(int j=1;j<=W;j++){
                int v;
                if(scanf("%d",&v)!=1) return 0;
                ar[v]=i; ac[v]=j;
            }
        for(int v=N; v>=1; v--){
            long long nv = v + D;
            if(nv>(long long)N) suf[v]=0;
            else {
                long long c = labs((long long)ar[v]-ar[nv]) + labs((long long)ac[v]-ac[nv]);
                suf[v] = c + suf[nv];
            }
        }
        int Q;
        if(scanf("%d",&Q)!=1) return 0;
        while(Q--){
            int L,Rr;
            scanf("%d %d",&L,&Rr);
            printf("%lld\n", suf[L]-suf[Rr]);
        }
        return 0;
    }
    
    
    • 1

    信息

    ID
    2568
    时间
    1000ms
    内存
    256MiB
    难度
    (无)
    标签
    递交数
    0
    已通过
    0
    上传者