最长不XX子序列

来源:互联网 发布:康熙字典体 mac 编辑:程序博客网 时间:2024/05/24 03:02
#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;}

0 0
原创粉丝点击