0001 uint64_t mr1Pass(uint64_t H[], Rank n) { //单趟扫描版 0002 Stack<Rank> SR; //次栈顶、栈顶总是s[r]-1与r,当前的t = t[r] 0003 uint64_t maxRect = 0; 0004 for (Rank t = 0; t <= n; t++) { //对于以t为右限的 0005 while (!SR.empty() && (t == n || H[SR.top()] >= H[t])) { //每一个极大矩形 0006 Rank r = SR.pop(), s = SR.empty() ? 0 : SR.top()+1; //次栈顶即是左限 0007 maxRect = max(maxRect, H[r]*(t-s)); //算出面积,并择优更新 0008 } //while 0009 SR.push(t); //栈中只记录所有的H[s] = min{ H[k] | s <= k <= t } 0010 } //assert(SR.empty()) 0011 SR.pop(); return maxRect; //弹出尾哨兵,返回最大面积 0012 } //每项进栈、出栈不过常数次,累计成本O(n)