P1020 导弹拦截
#include<iostream> #include<cstdio> #include<algorithm> #include<cstring> using namespace std; int f[100010]; int a[100010],temp[100010],len; int cmp(int a,int b) { return a>b; } int main() { //freopen("daodan.txt","r",stdin); //freopen("daodanout.txt","w",stdout); int n=0,ans=0,t=0; while(scanf("%d",&a[++n])!=EOF)continue; temp[1]=a[1]; len=1; for(int i=2;i<n;i++) { if(a[i]<=temp[len]) { temp[++len]=a[i]; continue; } t=upper_bound(temp+1,temp+len+1,a[i],cmp)-temp; temp[t]=a[i]; } cout<<len<<endl; len=1; for(int i=1;i<n;i++) { if(a[i]>temp[len]) { temp[++len]=a[i]; continue; } t=lower_bound(temp+1,temp+len+1,a[i])-temp; temp[t]=a[i]; } cout<<len<<endl; return 0; }
终于用n logn 的效率得到导弹拦截200满分。
和上一篇类似,用upperbound lower_bound 真香,也了解到它们也可以加排序条件cmp。