1402 最大值(更新思維,模擬)

2021-10-01 04:59:47 字數 1217 閱讀 7700

乙個n長的陣列s,滿足以下性質:

1)每個元素都是非負的整數,且s[1]=0;

2)任意兩個相鄰元素差值的絕對值不大於1,即| s[i]-s[i+1] |<=1;

3)對於部分特殊點xi,要求s[xi]<=ti(這樣的特殊點一共m個);

問在以上約束下s中的最大值最大可能是多少?

輸入多組測試資料,第一行乙個整數t,表示測試資料數量,1<=t<=5

每組測試資料有相同的結構構成:

第一行兩個整數n,m,表示s的長度與特殊點的個數,其中1<=n<=100000,0<=m<=50.

之後m行,每行兩個整數xi與ti,其中1<=xi<=n,0<=ti<=100000,且xi以增序給出。

輸出每組資料一行輸出,即陣列的可能最大值。

輸入樣例

310 2

3 18 1

100000 0

2718 5

1 100000

30 100000

400 100000

1300 100000

2500 100000

輸出樣例

399999

2717

正向從1到n,如果沒有限制,就依次遞增1,如果有限制,就取那個限制和遞增到這的最小值。這樣保證1和每個限制點後面都是符合題意的遞增,但是限制點前面這個位置可能會有落差(之前遞增多了)。不過我們再反向來一遍,再使每乙個限制點前面都是符合題意的遞增,每個位置取反向這個過程和正向掃過的最小值。再對全域性取max。

#include.h>

using namespace std;

int a[

100010

],l[

100010

],r[

100010];

intmain()

a[1]=

0;res=0;

for(

int i=

1;i<=n;i++

) res=

0x3f3f3f3f

;for

(int i=n;i>=

1;i--

) res=0;

for(

int i=

1;i<=n;i++

) res=

max(res,

min(l[i]

,r[i]))

; cout<}return0;

}

滑動視窗的最大值 最小值更新結構

視窗 可以理解為一段連續子陣列,下標範圍為 l,r 滑動視窗 l r會改變,改變方式是右移,r會右移,l也會右移,但始終保持l滑動視窗的最大值 最小值更新結構 對某乙個陣列,初始時,l r均位於最左端,l r只可以向右移,且始終有l以陣列arr 為例解釋滑動視窗最大值更新結構維護的過程,使用 來表示...

51nod 1402 最大值問題

乙個n長的陣列s 注意這裡的陣列初始下標設為1,而不是0,即n個元素為s 1 s 2 s n 滿足以下性質 1 每個元素都是非負的整數,且s 1 0 2 任意兩個相鄰元素差值的絕對值不大於1,即 s i s i 1 1 3 對於部分特殊點xi,要求s xi ti 這樣的特殊點一共m個 問在以上約束下...

視窗和視窗內最大值的更新結構

對於乙個陣列,我們有乙個l來表示視窗的最左邊,還有乙個r來表示最右邊。l和r只能向右移動,不能回退。l往右走是減數,r往右走就是加數,並且l也不能超過r。如果你想要得到乙個視窗的最大值,那麼你當然可以通過遍歷的方法來實現,但這樣每次獲得視窗中最大值的代價就是遍歷的代價。如果想要o 1 的時間複雜度那...