1 条题解

  • 1
    @ 2024-4-2 14:41:14

    这道题和课上的OJ类似,只不过变成了长方形以及最后求的是差的最大值,注意下一下修改就可以了~,

    参考代码
    
    #include<iostream>
    using namespace std;
    int  head = 1, tail, ans = -0x3f3f3f3f, HEAD, TAIL;
    int a[1003][1003], max1[1003][1003], max2[1003][1003], min1[1003][1003], min2[1003][1003], q[1003], Q[1003];
    int x, m, n,y;
    int main()
    {
        cin >> n >> m >> x >> y;
        for ( int i = 1; i <= n; i++)
        {
            for (int j = 1; j <= m; j++)
                cin >> a[i][j];
        }
        for (int i = 1; i <= n; i++)
        {
            head = tail = q[1] = 1;
            HEAD = TAIL = Q[1] = 1;
            for (int j = 2; j <= m; j++)
            {
                while (a[i][j] >= a[i][Q[TAIL]] && HEAD <= TAIL) TAIL--;
                Q[++TAIL] = j;
                if (j - Q[HEAD] >= y) HEAD++;
    
            while (a[i][j] <= a[i][q[tail]] && head <= tail) tail--;
            q[++tail] = j;
            if (j - q[head] >= y) head++;
            if (j >= y) max1[i][j - y + 1] = a[i][Q[HEAD]], min1[i][j - y + 1] = a[i][q[head]];
        }
    }
    for (int j = 1; j <= m - y + 1; j++)
    {
        head = tail = q[1] = 1;
        HEAD = TAIL = Q[1] = 1;
        for (int i = 2; i <= n; i++)
        {
            while (max1[i][j] >= max1[Q[TAIL]][j] && HEAD <= TAIL) TAIL--;
            Q[++TAIL] = i;
            if (i - Q[HEAD] >= x) HEAD++;
    
            while (min1[i][j] <= min1[q[tail]][j] && head <= tail) tail--;
            q[++tail] = i;
            if (i - q[head] >= x) head++;
            if (i >= x) max2[i - x + 1][j] = max1[Q[HEAD]][j], min2[i - x + 1][j] = min1[q[head]][j];
        }
    }
    for (int i = 1; i <= n - x + 1; i++)
    {
        for (int j = 1; j <= m - y + 1; j++)
            ans = max(ans, max2[i][j] - min2[i][j]);
    }
    cout << ans;
    return 0;
    

    }

    • 1

    信息

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