已知兩個長度為N的數組A和B,下標從0標號至N-1。
現在定義一種D序列 (假設長度為L),這種序列滿足下列條件:
1. 0 <= D[i] <= N-1
2. A[D[i]] < A[D[i+1]] (0 <= i < L-1)
3. B[D[i]] > B[D[i+1]] (0 <= i < L-1)
求滿足條件的D序列的最大長度。
(其實這種序列叫做D序列的原因是:這道題是D題)
多組數據,每組數據第一行是一個整數N。(1 <= N <= 100000)
第二行中有N個正整數A[0]~A[N-1]。
第三行中有N個正整數B[0]~B[N-1]。
保證所有輸入整數在int范圍內。
對每組數據,輸出一個整數,表示D序列的最大長度L。
#include方法(2)代碼::using namespace std; int a[100005],b[100005]; int s[100005]; vector > T;//可以用vector存,也可以直接用數組 pair T[100005]; int main() { int n; while(~scanf(%d,&n)){ T.clear();//如果不初始或要出錯用數組就不需要了 for(int i = 0;i 第一個元素首先放入 s[1] for(int i = 1;i s[len])s[++len] = a[i]; else{ int p = lower_bound(s+1,s+len+1,t)-s; s[p] = t; } } printf(%d ,len); } return 0; }
#includeusing namespace std; int a[100005],b[100005]; int s[100005]; vector > T; int main() { int n; while(~scanf(%d,&n)) { T.clear(); for(int i = 0;i s[len]) s[++len] = a[i]; else{ int l = 1,r = len,mid; int ans = 0; while(l<=r)//這裡的二分法采用了左閉右閉的思路 { mid = (r+l)/2; if(s[mid]