乙個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 的時間複雜度那...