导弹拦截( 二分+dilworth定理)
https://www.luogu.org/problemnew/show/P1020 原题
接下来是dilworth定理
https://blog.csdn.net/u011676717/article/details/11842809
关键就是: 如果是求下降子序列的最小划分,相当于是求最小反链划分,等于最长不下降子序列的长度。
。。求 下降子序列的最小划分 等于最长非下降子序列长度(确定
求非上升子序列的最小划分 等于最长非下降子序列长度还是等于最长上升子序列长度? 。。。
1 const int INF= 0x3f3f3f3f; 2 3 int a[N]; 4 int q[N],book[N]={0}; 5 6 int main() 7 { 8 memset(q,INF,sizeof(q)); 9 int cnt=0; 10 while(cin>>a[cnt]) cnt++; 11 12 for(int i=cnt-1;i>=0;i--) 13 *upper_bound(q,q+cnt,a[i])=a[i]; 14 /* lower和upper的这两个函数原来要求是升序,题目要求降序, 于是就从i=cnt-1 15 开始,从后往前升序,upper是找到大于a[i]的第一个 ,因为题目的要求是非升序,存在等于的情况 16 */ 17 cout<<lower_bound(q,q+cnt,INF)-q<<endl;//这里还是lower 18 19 memset(q,INF,sizeof(q)); 20 for(int i=0;i<cnt;i++) 21 *lower_bound(q,q+cnt,a[i])=a[i]; //这里用>=没毛病 22 cout<<lower_bound(q,q+cnt,INF)-q<<endl; 23 }