导弹拦截( 二分+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 }

 

posted @ 2018-07-17 17:40  木流牛马  阅读(193)  评论(0编辑  收藏  举报