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

题目:http://acm.hdu.edu.cn/showproblem.php?pid=1025


第一次写最长上升子序列不是写的这题,所以对于这个最长上升子序列的模板题也没什么好说的,主要坑点在于,如果答案是一road用单数..............


[cpp]  view plain  copy
  1. //Must so  
  2. #include<bits/stdc++.h>  
  3. #define mem(a,x) memset(a,x,sizeof(a))  
  4. #define sqrt(n) sqrt((double)n)  
  5. #define pow(a,b) pow((double)a,(int)b)  
  6. #define inf (1<<29)  
  7. #define NN 100005  
  8. using namespace std;  
  9. const double PI = acos(-1.0);  
  10. typedef long long LL;  
  11.   
  12. /* 
  13.     Description: 最长上升子序列  
  14.      
  15.     定义d[k]:长度为k的上升序列最末元素(终点元素) 
  16.     //注意d中元素是单调递增的 
  17.     初始化:len = 1,d[1]=a[1], 
  18.     然后对于a[i]: 
  19.         if a[i] > d[len]   
  20.             len++,d[len] = a[i] 
  21.         else  
  22.              from d[1] to d[len]找到一个j 
  23.              满足 d[j-1]<a[i]<d[j] 
  24.              更新d[j] = a[i]  
  25. */  
  26.   
  27. int d[NN],a[NN];  
  28. int main()  
  29. {  
  30.     int n;  
  31.     int kas = 1;  
  32.     while (cin>>n)  
  33.     {  
  34.         for (int i = 1,p,r;i <= n;++i)  
  35.         {  
  36.             scanf("%d%d",&p,&r);  
  37.             a[p] = r;  
  38.         }  
  39.         int len = 1;  
  40.         d[1] = a[1];  
  41.         for (int i = 2;i <= n;++i)  
  42.         {  
  43.             if (a[i] > d[len])  
  44.             {  
  45.                 d[++len] = a[i];  
  46.             }  
  47.             else   
  48.             {  
  49.                 int p = lower_bound(d,d+len,a[i]) - d;  
  50.                 d[p] = a[i];  
  51.             }  
  52.         }  
  53.         printf("Case %d:\n",kas++);  
  54.         if (len == 1) puts("My king, at most 1 road can be built.");  
  55.         else printf("My king, at most %d roads can be built.\n",len);  
  56.         puts("");  
  57.     }   
  58.     return 0;  
  59. }  
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值