week5作業 單調棧 差分與字首和 尺取法

2021-10-04 08:07:09 字數 3415 閱讀 1881

給定乙個直方圖,求直方圖中可連成的最大矩形面積

問題核心:單調遞增棧

利用單調遞增棧維護各個下標(左端點下標,利用各個高度判斷大小關係)

面積=下標之差*高度

注意資料範圍,本題需使用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 ...