HDU 1025 (最长上升子序列(nlogn)算法)

ゝ一世哀愁。 2024-02-17 19:22 173阅读 0赞

尴尬本题真是各种WR都遇到了。 。哎。不负苦心人

题意:给一个n代表两边城市的个数,两边都有n个城市,城市编号不会重复,要求找最多能修多少路(路不能交叉)

思路:就是找最长上升子序列(用复杂度nlogn的方法做)

AC代码如下:

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<algorithm>
  4. using namespace std;
  5. const int maxn=5e5+10;
  6. int t[maxn];
  7. int v[maxn];
  8. int n;
  9. int len;
  10. int binary_seacher(int i){
  11. int left=1,right=len;
  12. while(left<=right){ //不要忘记了这里的等号
  13. int mid=(left+right)/2;
  14. if(v[i]>t[mid])
  15. left=mid+1;
  16. else
  17. right=mid-1;
  18. }
  19. return left;
  20. }
  21. int main(){
  22. int count1=0;
  23. while(scanf("%d",&n)==1){
  24. memset(v,0,sizeof(v));
  25. memset(t,0,sizeof(t));
  26. for(int i=0;i<n;i++){
  27. int p,r;
  28. scanf("%d%d",&p,&r);
  29. v[p]=r;
  30. }
  31. t[1]=v[1];
  32. len=1;
  33. for(int i=2;i<=n;i++){
  34. if(v[i])
  35. if(v[i]>t[len])
  36. t[++len]=v[i];
  37. else{
  38. int k=binary_seacher(i);
  39. t[k]=v[i];
  40. }
  41. }
  42. printf("Case %d:\n",++count1);
  43. if(len==1)printf("My king, at most %d road can be built.\n\n",len);
  44. else printf("My king, at most %d roads can be built.\n\n",len);
  45. }
  46. return 0;
  47. }

发表评论

表情:
评论列表 (有 0 条评论,173人围观)

还没有评论,来说两句吧...

相关阅读