ap 神牛準備給自己蓋一座很華麗的宮殿。於是,他看中了一塊n*m 的矩形空地。
空地中每個格仔都有自己的海拔高度。ap 想讓他的宮殿的平均海拔在海平面之上(假設
海平面的高度是0,平均數都會算吧?)。而且,ap 希望他的宮殿盡量大,能夠容納更
多的人來膜拜他。請問ap 的宮殿最後會有多大?
輸入格式:
第一行為n 和m。之後n 行,每行m 個數,描述的空地的海拔。
輸出格式:
輸出一行,表示宮殿最大面積。
輸入樣例:
3 24 0
-10 8
-2 -2
輸出樣例:
題意很簡單,求最大子矩陣和,且該矩陣和大於等於0。
輸入時順便做字首和,然後是用三重迴圈列舉矩陣的長和寬,分別是寬的起始到寬的結束和長。
當當前矩陣與上乙個矩陣相加大於0時,可直接得到乙個新的矩陣並更新答案;
所以這道題最終要解決的是如何處理當前矩陣與上乙個矩陣相加小於0的情況。
易知每個矩陣都可被縱向分割為兩個小矩陣,那麼就可以用二分查詢,看當前矩陣和上乙個矩陣組成的新矩陣是否能被分割成這樣兩個矩陣:乙個矩陣和小於0,另乙個大於0;
如果可以找到,那麼更新答案;
因為寬始終不變,所以還需記錄下小於0的那個矩陣的長,再用新矩陣的長減去即可;
最後要注意每次記錄下矩陣和小於0的值和該矩陣的長,用單調棧記錄。
/*由於某些原因,我全開了long long
*/#include
#include
#include
using
namespace
std;
long
long
n,m,ans;
long
long top,sta[222222
];long
long s[222][222
],area;
long
long a[222][222],kn[222222],f2[222][222
];long
long ef(long
long x)//
二分查詢出當前矩陣所包含的最小的小於0的矩陣
else l=mid+1
; }
return
ans1;
}int
main()
for(long
long i=1;i<=m;i++)//
列舉起始寬
for(long
long j=i;j<=m;j++)//
列舉結束寬}}
}cout
return0;
}
洛谷 P1565 牛宮
題目 牛宮 思路 咳咳,先放個提交記錄 嗯再來個mjy0724的思路 然後就沒我什麼事了 有這麼幾點需要注意的地方 1 vector一定不能作為引數傳進函式,會t到飛起,親測100 50 2 第一列數要單獨判斷 3 字首和的處理,i,j 的字段和大於0的條件是sum j sum i 1 而非sum ...
洛谷P1565牛宮
傳送門 題目點這裡 首先理解題目,就是要求給定矩陣中權值和不小於零的最大子矩陣,資料範圍200也還不算棘手,暴力n 4的演算法也可以水到50分。正解要用到單調棧配合二分和字首和,複雜度n 3logn,跑得也還算快。分析一下,首先用乙個陣列a i j 記錄下第 i 行前 j 個元素之和,然後開始乙個個...
洛谷 P2805 BZOJ 1565 植物大戰殭屍
plants vs.zombies pvz 是最近十分風靡的一款小遊戲。plants 植物 和zombies 殭屍 是遊戲的主角,其中plants防守,而zombies進攻。該款遊戲包含多種不同的挑戰系列,比如protect your brain bowling等等。其中最為經典的,莫過於玩家通過控...