線段樹等等容易tle,我們需要乙個o(n)的演算法來解決這個問題。
思路:可以看出,這個視窗是可以用乙個雙向佇列來模擬的,每當後方加入乙個數,都要從佇列尾部開始淘汰掉所有的小於它的數,保證佇列中每乙個數的後面,在視窗範圍內沒有大於等於它的數。當隊首元素不在視窗範圍時,隊首元素出隊。這樣操作後,隊內的元素都是單調的,所以叫作單調佇列
p1440陣列模擬佇列**:
了解單調佇列後,單調棧讓人顧名思義想到的就是棧內所有元素是單調的#include #include #include #include using namespace std;
int n, m;
struct ab
que[2000005];
int head = 1, tail = 1;
int main()
que[tail].l = i;
que[tail++].v = num;
while (que[head].l <= i - m)
printf("%d\n", que[head].v);
} scanf("%d", &n); //吞掉最後乙個數的輸入
return 0;
}
解決問題:
這兩個問題本質是一樣的,但是樸素演算法顯然是 \(o(n^2)\) 的,我們要實現時間上的降維就要使用單調棧。
模板題:洛谷p5788
p5788陣列模擬棧**
#include #include #include #include using namespace std;
int n;
int top = 1;
struct ab
sta[3000005];
int ans[3000005] = ;
int main()
sta[top].l = i;
sta[top++].v = xx;
} while (top != 1)
for (int i = 1; i < n; ++i)
printf("%d", ans[n]);
return 0;
}
單調佇列與單調棧
單調棧 單調棧,顧名思義,就是維持單調性 遞增或者遞減 的棧結構,如果新入棧的元素破壞了單調性,就彈出原先棧內元素,直到能夠滿足單調性 用途 它可以很方便地求出某個數的左邊或者右邊第乙個比它大或者小的元素,而且總時間複雜度o n 並且單調棧本身並不難實現 維護 每次入棧前先檢驗入棧後是否會破壞棧的單...
單調佇列與單調棧
線段樹等等容易tle,我們需要乙個o n 的演算法來解決這個問題。思路 可以看出,這個視窗是可以用乙個雙向佇列來模擬的,每當後方加入乙個數,都要從佇列尾部開始淘汰掉所有的小於它的數,保證佇列中每乙個數的後面,在視窗範圍內沒有大於等於它的數。當隊首元素不在視窗範圍時,隊首元素出隊。這樣操作後,隊內的元...
單調棧與單調佇列
單調棧 單調棧就是棧內元素保持單調性的棧 遍歷整個序列,每一次從棧頂彈出會破壞單調性的元素,最後將當前元素加入棧頂 由於每個元素最多入棧一次,出棧一次,所以可以在 o n 的時間複雜度內處理資料 相關題目 hdu1506 largest rectangle in a histogram includ...