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.     Name: HDU 1025 
  14.     Copyright:  
  15.     Author: Must so 
  16.     Date: 24/03/16 10:30 
  17.     Description: 最长上升子序列  
  18.      
  19.     定义d[k]:长度为k的上升序列最末元素(终点元素) 
  20.     //注意d中元素是单调递增的 
  21.     初始化:len = 1,d[1]=a[1], 
  22.     然后对于a[i]: 
  23.         if a[i] > d[len]   
  24.             len++,d[len] = a[i] 
  25.         else  
  26.              from d[1] to d[len]找到一个j 
  27.              满足 d[j-1]<a[i]<d[j] 
  28.              更新d[j] = a[i]  
  29. */  
  30.   
  31. int d[NN],a[NN];  
  32. int main()  
  33. {  
  34.     int n;  
  35.     int kas = 1;  
  36.     while (cin>>n)  
  37.     {  
  38.         for (int i = 1,p,r;i <= n;++i)  
  39.         {  
  40.             scanf("%d%d",&p,&r);  
  41.             a[p] = r;  
  42.         }  
  43.         int len = 1;  
  44.         d[1] = a[1];  
  45.         for (int i = 2;i <= n;++i)  
  46.         {  
  47.             if (a[i] > d[len])  
  48.             {  
  49.                 d[++len] = a[i];  
  50.             }  
  51.             else   
  52.             {  
  53.                 int p = lower_bound(d,d+len,a[i]) - d;  
  54.                 d[p] = a[i];  
  55.             }  
  56.         }  
  57.         printf("Case %d:\n",kas++);  
  58.         if (len == 1) puts("My king, at most 1 road can be built.");  
  59.         else printf("My king, at most %d roads can be built.\n",len);  
  60.         puts("");  
  61.     }   
  62.     return 0;  
  63. }  

你可能感兴趣的:(HDU 1025 最长上升子序列(nlogn))