错了
by love2076328848 @ 2018-04-01 11:57:40
将第98行改为:
```
MinQ.pop(j - a + 2+c);
```
将第93行改为:
```
MinQ.pop(j - b + 2+d);
```
这是修改后的代码:
```cpp
#include<bits/stdc++.h>
#define INF 2147483647
#define N 1010
using namespace std;
struct MinQue{
int Key[N];
int Num[N];
int Left, Right;
void push(int x, int Number)
{
while(Right >= Left && Key[Right] >= x)
-- Right;
++ Right;
Key[Right] = x;
Num[Right] = Number;
}
void pop(int Number)
{
while(Num[Left] < Number && Left <= Right)
++ Left;
}
int top()
{
if(Left <= Right)return Key[Left];
else return INF;
}
void clear()
{
Left = 1;
Right = 0;
}
};
MinQue MinQ;
int Flower[N][N];
int Plant[N][N];
void read(int &x)
{
x = 0;
char ch = getchar();
while(ch < '0' || ch > '9')
ch = getchar();
while(ch >= '0' && ch <= '9')
{
x = x * 10 + (ch ^ 48);
ch = getchar();
}
}
int Fert[N][N];
int Dp[N][N];
int Area(int a, int b, int c, int d)
{
return Dp[c][d] - Dp[a - 1][d] - Dp[c][b - 1] + Dp[a - 1][b - 1];
}
int Row[N][N];
int MinFlower[N][N];
int main()
{
int n, m, a, b, c, d;
read(n), read(m), read(a), read(b), read(c), read(d);
for(int i = 1; i <= n; ++ i)
for(int j = 1; j <= m; ++ j)
read(Fert[i][j]);
for(int i = 1; i <= n; ++ i)
for(int j = 1; j <= m; ++ j)
Dp[i][j] = Dp[i - 1][j] + Dp[i][j - 1] - Dp[i - 1][j - 1] + Fert[i][j];
for(int i = a; i <= n; ++ i)
for(int j = b; j <= m; ++ j)
Plant[i][j] = Area(i - a + 1, j - b + 1, i, j);
for(int i = c; i <= n; ++ i)
for(int j = d; j <= m; ++ j)
Flower[i][j] = Area(i - c + 1, j - d + 1, i, j);
for(int i = c; i <= n; ++ i)
{
for(int j = d; j <= m; ++ j)
{
MinQ.push(Flower[i][j], j);
MinQ.pop(j - b + 2+d);
Row[i][j] = MinQ.top();
}
MinQ.clear();
}
for(int i = d; i <= m; ++ i)
{
for(int j = c; j <= n; ++ j)
{
MinQ.push(Row[j][i], j);
MinQ.pop(j - a + 2+c);
MinFlower[j][i] = MinQ.top();
}
MinQ.clear();
}
int Max = 0;
for(int i = a; i <= n; ++ i)
for(int j = b; j <= m; ++ j)
Max = max(Max, Plant[i][j] - MinFlower[i - 1][j - 1]);
printf("%d", Max);
return 0;
}
```
by Nuclear_Pasta @ 2022-07-17 19:55:00