P1020 導彈攔截 洛谷

 思路:第一問求  最長不升子序列 ,第二問求 最長上升子序列

#include <bits/stdc++.h>
#include <map>
using namespace std;
typedef long long ll;
map<ll,ll> mp;
ll a[100100],n,ans1[100100],ans2[100100];
ll len1,len2;
queue<ll> q;
int main()
{

    int i=0,n,m;
    while(cin>>a[++i]);
    n=m=i-1;

    len1=len2=1;
    ans1[1]=ans2[1]=a[1];

    for(int i=2;i<=n;i++)
    {
        if(a[i]<=ans1[len1])
            ans1[++len1]=a[i];
        else
        {
            int pos=upper_bound(ans1+1,ans1+len1+1,a[i],greater<int>())-ans1;
            ans1[pos]=a[i];
        }

        if(a[i]>ans2[len2])
            ans2[++len2]=a[i];
        else
        {
            int pos=lower_bound(ans2+1,ans2+len2+1,a[i])-ans2;
            ans2[pos]=a[i];
        }
    }

    cout<<len1<<endl<<len2<<endl;
    return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章