洛谷 P1020 导弹拦截

https://www.luogu.org/problemnew/show/P1020

第一问就是最长不上升子序列,第二问题解说用离散数学里的Dilworth定理,看不懂证明,它的结论是:将序列划分若干个为不上升子序列,使得划分的个数最小,那么这个个数等于序列的最长上升子序列的大小。

#include<bits/stdc++.h>
using namespace std;

int n;

int d[100005];
int L=1,R=0;

int d2[100005];

int binary(int v)
{
    int l=L,r=R,m;
    while(l<r)
    {
        m=(l+r)/2;
        if(d[m]>=v)l=m+1;
        else r=m;
    }    
    return r;
}

int main()
{
//	freopen("input.in","r",stdin);
    fill(d,d+100005,-(1<<30)); 
    fill(d2,d2+100005,(1<<30));


    while(cin>>n)
    {    
        R++;    
        int pos=binary(n);  
        d[pos]=n;   
        
        *lower_bound(d2+1,d2+R+1,n)=n;      
    }      
    for(int i=R;i>=L;i--)if(d[i]!=-(1<<30))
    {
        cout<<i<<endl;
        break;
    }
    for(int i=R;i>=L;i--)if(d2[i]!=(1<<30))
    {
        cout<<i<<endl;
        break;
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/Wen_Yongqi/article/details/85078522