最长非单调增序列(最长非单调增序列,,要用N*LOG N(非常值得琢磨的算法。)

http://acm.pku.edu.cn/JudgeOnline/problem?id=1887

(最长非单调增序列,,要用N*LOG N(不然会超时。))

二分模板:

int Find(int a,int end)

{

         if(a>=ans[1])return 1;

         for(int beg=1;beg!=end-1;)

         {

                   int mid=(beg+end)/2;

                   if(ans[mid]<=a)end=mid;

                   else beg=mid;

         }

         return end;

}

刚开始这个N*LOGN的算法主要是二分的方面取优

然而,,鸭子的一句话让我仔细想想

我才发现

巧妙的是他不是根据原先N^2的算法在原地取优,而是换一种思维,用另外一个数组来记录

数组ans[i]记录长度为i的最优序列的最小值的最大值,

感觉像是贪心多一点,这是一个值得反复琢磨的算法,相信在以后会有很大的用处,,

原文地址:https://www.cnblogs.com/gdutbean/p/1698248.html