1. 程式人生 > >洛谷 P1020 導彈攔截

洛谷 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;
}