有大佬救我吗

P2219 [HAOI2007] 修筑绿化带

错了
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


|