NYOJ 214(LIS,二分插入)
View Code
//参考大牛的代码,在stack中插入数据是有序的,而且是进行替换而不需要挪动——也就是说,我 们可以使用二分查找,将每一个数字的插入时间优化到O(logN) #include<stdio.h> #define min -32769 int stack[100001];//模拟栈,为了更形象 int main() { int T,i,num;int top,low,high,mid; while(~scanf("%d",&T)) { top=0;stack[0]=min; for(i=0;i<T;i++) { scanf("%d",&num); if(num>stack[top])//如果输入进来的数比栈顶的数大,直接插入到栈顶 { top++; stack[top]=num; } else { low=1;high=top; while(low<=high)/*二分查找,寻找插入位置*/ { mid=(low+high)/2; if(num>stack[mid]) { low=mid+1; } else { high=mid-1; } } stack[low]=num;//**找到插入位置,并替换点原值**// } } printf("%d\n",top); } return 0; }
作者:火星十一郎
本文版权归作者火星十一郎所有,欢迎转载和商用,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.