給定乙個直方圖,求直方圖中可連成的最大矩形面積
問題核心:單調遞增棧
利用單調遞增棧維護各個下標(左端點下標,利用各個高度判斷大小關係)
面積=下標之差*高度
注意資料範圍,本題需使用long long
#include
#include
using
namespace std;
const
int maxn=
1e6;
long
long n,h[maxn]
;int
main
(void
) stindex.
push
(nowindex)
; h[nowindex]
=h[i];}
}printf
("%lld\n"
,ans);}
return0;
}
每個城市都有乙個價值,給定乙個區間,為區間範圍內的所有城市增加q次價值c
題目定位:差分與字首和
先用差分處理,在左端點的差分陣列增加價值c,在右端點的差分陣列減少價值c
用字首和重新合成新的價值
注意資料範圍,需要用long long
#include
using
namespace std;
const
int maxn=
1e7;
long
long n,q,l,r,c;
long
long a[maxn]
;long
long b[maxn]
;int
main
(void
)for
(int i=
0;i)printf
("\n");
return0;
}
字串僅包含 『q』, 『w』, 『e』, 『r』 四種字元。
如果四種字元在字串**現次數均為 n/4,則其為乙個平衡字串。將 s 中連續的一段子串替換成相同長度的只包含那四個字元的任意字串,使其變為乙個平衡字串,問替換子串的最小長度?
如果 s 已經平衡則輸出0。
問題定位:尺取法(有連續的區間和明確的方向)
求出各字母次數,及最大的乙個字母的次數
在l,r範圍內判定,假設範圍之外的字母不變,求出在該範圍內替換掉所有需要字母的個數後,仍然剩下的可隨意安排的空位置若大於等於0且為4的倍數則表示該範圍可以滿足,需要再縮小範圍判斷(l++)
否則需要擴大範圍(r++)
注意下標的計算和移動範圍問題
#include
#include
#include
using
namespace std;
const
int maxn=
1e6;
const
int inf=
1e6;
int n;
char s[maxn]
;struct sum
sum(
int q,
int w,
int e,
int r)
:sumq
(q),
sumw
(w),
sume
(e),
sumr
(r) sum operator-(
const sum&t)
} sum[maxn]
;int
main
(void
)int l=
0,r=
0,ans=inf;
while
(lelse
r++;}
printf
("%d\n"
,ans)
;return0;
}
一組數,乙個視窗,不斷向右移動,求出每次視窗所在位置是其中元素的最大、最小值
window position minimum value maximum value
[1 3 -1] -3 5 3 6 7 -1 3
1 [3 -1 -3] 5 3 6 7 -3 3
1 3 [-1 -3 5] 3 6 7 -3 5
1 3 -1 [-3 5 3] 6 7 -3 5
1 3 -1 -3 [5 3 6] 7 3 6
1 3 -1 -3 5 [3 6 7] 3 7
輸入:
831
3-1-
3536
7
輸出:
-1-
3-3-
3333
3556
7
問題定位:單調佇列
維護2個單調佇列:遞增(求最小值)、遞減(求最大值)
以單調遞增隊列為例:
保證佇列中只有視窗大小個元素:佇列不為空,且元素下標從隊尾插入下標,要求值遞增,若隊尾元素不滿足大小關係,則從隊尾彈出元素,直至能插入。
每次的隊首元素即為最小元素
單調佇列用deque,涉及隊首的刪除、隊尾的插入與刪除
tle說明:
#include
#include
using
namespace std;
const
int maxn=
1e7;
int k,n,a[maxn]
;int
main
(void
)printf
("\n");
for(
int i=
0;i)printf
("\n");
return0;
}
下附tle**#include
#include
using
namespace std;
const
int maxn=
1e7;
int k,n,a[maxn]
;int
main
(void
)printf
("%d "
,a[dqminindex.
front()
]);}
printf
("\n");
for(
int i=
0;i<=n-k;i++
)printf
("%d "
,a[dqmaxindex.
front()
]);}
return0;
}
A 最大矩形單調棧解法 Week5作業)
1 是一道經典的單調棧問題 2 利用單調棧計算出當前高度的矩形左右兩邊可以延伸到的寬度 計算出當前矩形左邊第乙個比該矩形高度小的座標 計算出當前矩形右邊第乙個比該矩形高度小的座標 兩者之差,是以當前矩形高度為高的最大矩形的寬度 計算矩形面積,求出最大面積 3 利用乙個單調棧從左往右對矩形高度進行遍歷...
WEEK5 周記 作業 單調棧 最大矩形
給乙個直方圖,求直方圖中的最大矩形的面積。例如,下面這個中直方圖的高度從左到右分別是2,1,4,5,1,3,3,他們的寬都是1,其中最大的矩形是陰影部分。輸入包含多組資料。每組資料用乙個整數n來表示直方圖中小矩形的個數,你可以假定1 n 100000.然後接下來n個整數h1,hn,滿足 0 hi 1...
字首和與差分
數列的字首和 sum i 表示a 1 a i 的和 用處1 求i j的和sum j sum i 1 用處2 區間修改。設定乙個change陣列。當區間 i,j 上要加k時,我們令change i k,令change j 1 k。如果我們對change陣列求字首和的話,字首和sum change i ...