乙個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<=5output每組測試資料有相同的結構構成:
第一行兩個整數n,m,表示s的長度與特殊點的個數,其中1<=n<=100000,0<=m<=50.
之後m行,每行兩個整數xi與ti,其中1<=xi<=n,0<=ti<=100000,且xi以增序給出。
每組資料一行輸出,即陣列的可能最大值。input示例
3output示例10 2
3 18 1
100000 0
2718 5
1 100000
30 100000
400 100000
1300 100000
2500 100000
399999
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...