hdoj1025

来源:互联网 发布:厦门大学吴春明知乎 编辑:程序博客网 时间:2024/06/08 06:49

问题可以借助求序列中的最长递增子序列解决,dp会超时,有一个O(nlogn)的方法来求最长递增序列,通过更新LIS[i]数组来实现,LIS[i]表示长度为i的最长递增序列的最小末尾,遍历原序列,保持LIS的更新即可

二分搜索的想法很好,但要写一个没bug的二分确实很难!

#include<cstdio>int road[500010];int lt[500010];int lis;void binary_search(int l,int r,int in){if(r-l==1) {if(lt[l]>in) lt[l]=in;else{lt[l+1]=in;if(l+1>lis) lis++;}return;}int mid=(r+l)/2;if(lt[mid]==in) return;if(lt[mid]>in) binary_search(l,mid,in);else binary_search(mid,r,in);}int main(){int n;int i;int tcase=1;int a,b;while(scanf("%d",&n)!=EOF){for(i=1;i<=n;i++){ scanf("%d %d",&a,&b);road[a]=b;}lis=1;lt[1]=road[1];for(i=2;i<=n;i++)binary_search(1,lis+1,road[i]);printf("Case %d:\n",tcase++);printf("My king, at most %d ",lis);if(lis>1) printf("roads can be built.\n\n");else printf("road can be built.\n\n");}return 0;}


 

 

0 0