洛谷 P1020 導彈攔截
阿新 • • 發佈:2018-12-23
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; }