#include <iostream>
#include <cstdio>
using namespace std;
int a[200020];
int g[200020];
int k;
void Find(int i) //最长不下降子序列
{
int l = 1, r = k;
int ans = 0;
while (l <= r)
{
int mid = (l+r) >> 1;
if (g[mid] <= a[i])
{
ans = mid;
l = mid+1;
}
else
r = mid-1;
}
if (g[ans+1] > a[i] || g[ans+1] == 0)
g[ans+1] = a[i];
if (ans == k)
k++;
}
void Find_(int i) //最长不上升子序列
{
int l = 1, r = k;
int ans = 0;
while (l <= r)
{
int mid = (l+r) >> 1;
if (g[mid] >= a[i])
{
ans = mid;
l = mid+1;
}
else
r = mid-1;
}
if (g[ans+1] < a[i] || g[ans+1] == 0)
g[ans+1] = a[i];
if (ans == k)
k++;
}
int main()
{
int n;
cin >> n;
for (int i=1; i<=n; i++) cin >> a[i];
g[1] = a[1]; k = 1;
for (int i=2; i<=n; i++) Find(i);
cout << "最长不下降子序列的的长度是:" << k << endl;
for (int i=0; i<=n; i++) g[i] = 0;
g[1] = a[1]; k = 1;
for (int i=2; i<=n; i++) Find_(i);
cout << "最长不上升子序列的长度是:" << k << endl;
return 0;
}
最长不XX子序列
最新推荐文章于 2022-11-08 21:29:19 发布