HAOI2007 修築綠化帶

2021-07-24 22:56:30 字數 1516 閱讀 1840

[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 中的補集的權值和的最大值。思路分析 通過分析題目後可以發現本題可以用二維單調佇列進行求解,同時利用到了二維字首和。即先...