這個單調棧的維護方法有些不一樣。
若存在矩形比他高,那麼就把所有比他高的矩形截到和他一樣高,然後按照h-c維護單調棧(事實上也就是把除了第乙個被截的矩形全部刪掉,然後再考慮是否刪掉第乙個),新元素不用插入,因為就算插入了也會被刪掉。
否則直接維護單調棧,事實上也就是考慮下要不要插入。
可以一直保證棧頂是最優解,o(1)查詢。
因為發現最優解只和h-c有關,所以按h-c維護單調棧。
因為可能存在截短刪除最優解的情況,所以不能只保留最優解。
截短是為了刪除一些不可能的解。
截完後還要維護單調棧。
#include#define maxn 1010
using namespace std;
typedef pairpii;
int n,m;
char map[maxn][maxn];
int max[maxn][maxn];
mapans;
vectors;
void cl()
void ps(pii x)
}else s.push_back(x);
}int main()
u=d;}}
for(int i=1;i<=n;i++)
ps(make_pair(j,i-max[i][j]+1));
pii ans=s.back();
ans[2*(ans.second+j-ans.first+1)]++;}}
for(map::iterator it=ans.begin();it!=ans.end();++it)
printf("%d x %d\n",it->second,it->first);
}return 0;
}
單調棧 模板 單調棧模板
biu 單調棧主要用於求取左邊第乙個比它大,或者比它小的數。就比如站隊隨便排成一列,可以求到每個人後面第乙個比他高的人。同理可以推廣至右邊,比它矮均可。這就是單調遞增棧 遞減棧,從前至 棧,從後向前入棧的區別了。單調棧比較抽象,非常具有智慧型的想法,可應用的場景相當少,根據幾個經典題目體會它的用法會...
單調佇列 單調棧
參考文章 單調佇列 poj 2823 給定乙個數列,從左至右輸出每個長度為m的數列段內的最小數和最大數。數列長度 n 106 m n n 106,m n n 106 m n 直接暴力求解複雜度在0 mn 可以考慮維護區間最值,單調佇列則是維護區間佇列的強大 單調佇列的定義 單調佇列實現的大致過程 1...
棧和佇列 單調佇列 單調棧
講解部落格鏈結 一 單調棧 1 什麼是單調棧?單調棧是指乙個棧內部元素具有嚴格單調性 單調遞增,單調遞減 的一種資料結構。2 單調棧的兩個性質 滿足從棧頂到棧底具有嚴格的單調性 滿足後進先出的特徵,越靠近棧底的元素越早的進棧。3 元素進棧的過程 對於當前進棧元素x 如果x 棧頂元素,x 進棧。否則 ...