HDU 1025 最长不下降子序列nlogn算法

题意:最长不下降子序列

思路:n*n的算法肯定超时,所以nlogn的写法(dp+二分)dp数组存的是当前最长的最长不下降子序列,数组内保证递增,因此可以二分找下一个数字需要插入的位置
注意输出格式,road和roads区别,还有要输出两个换行

#include 
#include 
#include 
#include 
using namespace std;
#define N 500100
int dp[N];
int road[N];
int binary(int n,int m)
{
    int l=1,r=n;
    while(l<=r)
    {
        int mid=(l+r)>>1;
        if(m>=dp[mid]) l=mid+1;
        else  r=mid-1;
    }
    return l;
}
int main()
{
    int n,t=0;
    while(scanf("%d",&n)!=EOF)
    {
        int a,b;
        memset(road,0,sizeof(road));
        memset(dp,0,sizeof(dp));
        for(int i=1;i<=n;i++)
        {
            scanf("%d%d",&a,&b);
            road[a]=b;
        }
        dp[1]=road[1];
        int len=1;
        for(int i=2;i<=n;i++)
        {
            int t=binary(len,road[i]);
            //cout<len) len++;
        }
        printf("Case %d:\n",++t);
        if(len==1) printf("My king, at most 1 road can be built.\n\n");
        else printf("My king, at most %d roads can be built.\n\n",len);
    }
}




你可能感兴趣的:(ACM_二分法,ACM_经典DP)