#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子序列
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.