找出區間最大值-最小值》=k的區間有多少個?
第一步:
將題目轉換為尺取求區間個數
原因:最大值和最小值都是會擴充的 ,區間擴充的必然會使得最大值++,最小值--
第二步:
確定尺取之後,下一步操作就是確定當前區間的最大值和最小值
考慮確定最大值和最小值可以考慮st表
但是預處理是nlog的,看資料範圍的話,出題人是故意卡了nlog
所以考慮單調佇列維護最大值和最小值
單調佇列只能維護靜態長度的最值問題?怎麼辦?
考慮尺取的單調性和單調佇列的單調性是一致的,所以可以同時維護
/*** keep hungry and calm coolguang!***/
#pragma gcc optimize(3)
#include ll n,m,p;
ll num[maxn];
int q1[maxn],q2[maxn];
int main()
int l1 = 1,r1 = 0,l2 = 1,r2 = 0,l = 1;
///q1維護最大值
///q2維護最小值
ll ans = 0;
for(int i=1;i<=n;i++)
}printf("%lld\n",ans);
return 0;
}/***41
5 1 -1
***/
牛客 NC209881 名作之壁 單調佇列
傳送門 給定乙個序列,求有多少個區間滿足區間最大值減區間最小值大於k。可以從反面入手來解決這個問題,就是把答案變成區間個數減去區間最大值減最小值小於等於k的區間個數,求後者我們可以通過列舉區間的右端點找區間左端點有多少種可能的情況,然後累加起來就行了。我們可以發現如果區間 l,r l,r l,r 滿...
單調棧 單調佇列 尺取 滑動視窗
尺取 單調棧 單調佇列 滑動視窗 當t不是字串時的模板 尺取模板 include include include include include includeusing namespace std typedef long long ll const int n 1e5 10 int arr n ...
單調線性結構之 單調佇列
簡介 乙個佇列內部的元素具有嚴格單調性的一種資料結構,分為單調遞增佇列和單調遞減佇列。1 維護區間最值 2 去除冗雜狀態 3 保持佇列單調 最大值是單調遞減序列,最小值是單調遞增序列 4 最優選擇在隊首。思想裸題 求所有長度為k的區間內的最大值 這種題的 就是單調佇列的模板了 維護隊首 對於上題就是...