[haoi2007] 修築綠化帶
時間限制:1 s 記憶體限制:128 mb
【問題描述】
為了增添公園的景致,現在需要在公園中修築乙個花壇,同時在畫壇四周修建一片綠化帶,讓花壇被綠化帶圍起來。
如果把公園看成乙個m*n的矩形,那麼花壇可以看成乙個c*d的矩形,綠化帶和花壇一起可以看成乙個a*b的矩形。
如果將花園中的每一塊土地的「肥沃度」定義為該塊土地上每乙個小塊肥沃度之和,那麼,
綠化帶的肥沃度=a*b塊的肥沃度-c*d塊的肥沃度
為了使得綠化帶的生長得旺盛,我們希望綠化帶的肥沃度最大。
【輸入】:
第一行有6個正整數m,n,a,b,c,d
接下來乙個m*n的數字矩陣,其中矩陣的第i行j列元素為乙個整數xij,表示該花園的第i行第j列的土地「肥沃度」。
【輸出】:
乙個正整數,表示綠化帶的最大肥沃程度。
【輸入輸出樣例】
parterre.in
4 5 4 4 2 2
20 19 18 17 16
15 14 13 12 11
10 9 8 7 6
5 4 3 2 1
parterre.out
132
【資料範圍】
30%的資料,1<=m,n<=50
100%的資料,1<=m,n<=1000,1<=a<=m,1<=b<=n,1<=c<=a-2,1<=d<=b-2,1<=「肥沃度」<=100
單調佇列
#include
#include
using
namespace
std;
#define maxn 1010
int map[maxn][maxn],n,m,a,b,c,d,s2[maxn][maxn]=;//s2表示c*d矩形的面積
int s[maxn][maxn]=,s1[maxn][maxn]=,ans=0;//s為字首和,s1為a*b矩形的面積
class sigal_queue
inline
void clear()
inline
void push_back(int x)
inline
int back()
inline
void pop_back()
inline
void pop_front()
inline
bool empty()
inline
int front()
}q;inline
int max(int x,int y)
void init()
}}void work()
}for(int i=c;i<=m;i++)
}}void solve()
}for(int j=b;j<=n;j++)
}printf("%d",ans);
}int main()
HAOI2007 修築綠化帶
問題描述 為了增添公園的景致,現在需要在公園中修築乙個花壇,同時在畫壇四周修建一片綠化帶,讓花壇被綠化帶圍起來。如果把公園看成乙個m n的矩形,那麼花壇可以看成乙個c d的矩形,綠化帶和花壇一起可以看成乙個a b的矩形。如果將花園中的每一塊土地的 肥沃度 定義為該塊土地上每乙個小塊肥沃度之和,那麼,...
題解 HAOI2007 修築綠化帶
題目意思比較簡單,就不在這裡贅述了 本著練習平衡樹的思路,我把方法嘗試往上面去套,結果想不出 只能棄掉平衡樹 最後想出來的方法是這樣的 我們運用類似於高維字首和那樣一維一維加上去的方法 先橫著統計在某個範圍內和最小的 c d 矩陣,把貢獻算在範圍的右下角 注意,這裡保證了這個矩陣在以 i,j 為右下...
HAOI2007 修築綠化帶 題解
題意分析 給出乙個 m n 的矩陣 a 要求從中選出乙個 a b 的矩陣 b 再從矩陣 b 中選出乙個 c d 的矩陣 c 要求矩陣 b,c 的邊界不能重合,求矩陣 c 在矩陣 b 中的補集的權值和的最大值。思路分析 通過分析題目後可以發現本題可以用二維單調佇列進行求解,同時利用到了二維字首和。即先...