HDU 1025 Constructing Roads In JGShining's Kingdom【LIS_nlogn】

题意: 给你两条街,上面的街编号从 1-n 下面的也是,然后告诉你他们的一些边,

    让你从中尽可能选出多的边,使他们两两之间没有交点。

分析: LIS 的变形,把一条街看成有序的,求令一条街的最长递增子序列,

    因为当 上面 i < j 时 有 f[i]<f[j]。

View Code
#include<stdio.h>
#include<string.h>
int d[500005];
int l[500005];
int bis(int len,int x)
{
    int low=0,high=len-1,mid;
    while(low<=high)
    {
        mid=(low+high)>>1;
        if(d[mid]>x)
            high=mid-1;
        else if(d[mid]<x)
            low=mid+1;
        else return mid;
    }
    return low;
}
int main()
{
    int ca=1,len,i,n,a,b,x,pos;
    while(scanf("%d",&n)!=EOF)
    {
        d[0]=5000006;
        len=1;
        for(i=1;i<=n;i++)
        {
            scanf("%d%d",&a,&b);
            l[a]=b;
        }
        for(i=1;i<=n;i++)
        {
            x=l[i];
            if(x>d[len-1])
                d[len++]=x;
            else
            {
                pos=bis(len,x);
                d[pos]=x;
            }
        }
        printf("Case %d:\nMy king, at most %d %s can be built.\n\n",ca++,len,len>1?"roads":"road");
    }
    return 0;
}

 

posted @ 2012-05-01 15:53  'wind  阅读(320)  评论(0编辑  收藏  举报