51nod 1402 最大值問題

2021-08-10 09:44:23 字數 1337 閱讀 4144

乙個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個);

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

input

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

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

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

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

output

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

3

10 2

3 18 1

100000 0

2718 5

1 100000

30 100000

400 100000

1300 100000

2500 100000

output示例

3

99999

2717

兩次for迴圈。
首先第一次,正著來,從i=1開始,不停地ans++,記錄到達這個點最大的就是ans值.如果當前點有限制,且ans大於限制了,讓ans=限制值,也就是最大值。這樣掃完答案是不正確的,因為我們只掃了向右走的,我們保證i到i+1滿足條件了,但是不能保證i+1到i滿足條件。因為存在limt的原因,我們可能5後面直接變成1了,這樣是不正確的。我們需要反向來一遍。求每一項的最小值的最大值。
#include #include #include #include #include#includeusing namespace std;

int limit[110000];

int l[110000];

int r[110000];

int n,m;

int main()

limit[1]=0;

int ans=0;

for(int i=1;i<=n;i++)

l[i]=ans;

}ans=n;

for(int i=n;i>=1;i--)

r[i]=ans;

}ans=-1;

for(int i=1;i<=n;i++)

cout<}

}

51Nod 1349 最大值(單調棧)

1349 最大值 基準時間限制 1 秒 空間限制 131072 kb 分值 80 難度 5級演算法題 有一天,小a給了小b一些數字,讓小b幫忙找到其中最大的數,由於小b是乙個程式猿,當然寫了乙個 很快的解決了這個問題。這時,的小c又出現了,他問小b,假如我只需要知道這些數字中的某個區間的最大值,你還...

51nod 1349 最大值 單調棧

有一天,小a給了小b一些數字,讓小b幫忙找到其中最大的數,由於小b是乙個程式猿,當然寫了乙個 很快的解決了這個問題。這時,的小c又出現了,他問小b,假如我只需要知道這些數字中的某個區間的最大值,你還能做嘛?小b經過七七四十九天的思考,終於完美的解決了這道題目,這次,他想也讓小c嚐嚐苦頭,於是他問小c...

51Nod1472 取餘最大值

題目看這裡 又是乙個七級題目 妥妥的分治啊,列舉右端點,左邊分兩段計數就好啦 關於標解 網上好像很多都是字首和 二分之類的,反正應該差不多快吧 include include include define n 300010 define ll long long using namespace st...