#include <bits/stdc++.h>
#define ll long long
#define pir pair<int,int>
#define pirl pair<ll,ll>
#define debug(x) cout << #x << ":" << x << "\n"
const int N = 2e5+7;
const ll mod = 1e9+7;
const ll ds = 1e18;
const double eps = 1e-8;
ll read(){ll x=0,f=1;char c=getchar(); while(c<'0'||c>'9') {if(c=='-') f=-1;c=getchar();} while(c>='0'&&c<='9') x=(x<<1)+(x<<3)+c-'0',c=getchar(); return f*x;}
void print(ll x){ if(x < 0) {putchar('-');x = -x;} if(x/10) print(x/10); putchar(x%10+'0'); }
using namespace std;
int nums[5005],d[5005];//d[i]表示长度为i时最长递增子序列结尾元素值最小是多少。
void solve(){
int n;
cin >> n;
for(int i = 0; i < n; i++){
cin >> nums[i];
}
d[1] = nums[0];
int len = 1;
for(int i = 1; i < n; i++){
if(nums[i] > d[len]){
d[++len] = nums[i];
}
else{
int l = 1,r = len,pos = 0;
while(l <= r){
int mid = (l+r)>>1;
if(nums[i] > d[mid]){
pos = mid,l = mid+1;
}
else r = mid-1;
}
d[pos+1] = nums[i];
}
}
}
int main(){
// int t;
// cin >> t;
// while(t--)
solve();
return 0;
}
最长递增子序列(贪心+二分)
最新推荐文章于 2023-09-20 10:10:15 发布