hdu 1025 Constructing Roads In JGShining's Kingdom

来源:互联网 发布:轻量级python ide 编辑:程序博客网 时间:2024/05/20 18:50

最长上升子序列

题意:有2条线,每条线上有n个点,现在给你一些连接方式,一条线的点去连接另外一条线上的点。问这些线不交叉,最多能连多少条线

#include<cstdio>#include<cstdlib>#include<cstring>#include<algorithm>#define maxn 500100using namespace std;struct tt{    int x,y;}A[maxn];struct node{    int a,b;} N[maxn];bool cmp(struct node a,struct node b){    if(a.a==b.a)return a.b<b.b;    if(a.a<b.a)return true;    return false;}int Find(int len,int c,int d){    int left=0,right=len-1;    while(left<=right)    {        int mid=(right+left)/2;        if(A[mid].x<=c&&A[mid].y<=d)         left=mid+1;        else right=mid-1;    }    return left;}int main(){    int n,ans=0;    while(~scanf("%d",&n))    {        for(int i=0; i<n; i++)            scanf("%d%d",&N[i].a,&N[i].b);        sort(N,N+n,cmp);        A[0].x=N[0].a,A[0].y=N[0].b;        int len=1;        for(int i=1; i<n; i++)        {            if(N[i].a>A[len-1].x&&N[i].b>A[len-1].y)            {                A[len].x=N[i].a,A[len].y=N[i].b;                len++;            }            else            {                int top=Find(len,N[i].a,N[i].b);                A[top].x=N[i].a,A[top].y=N[i].b;            }        }        printf("Case %d:\n",++ans);        if(len==1)printf("My king, at most %d road can be built.\n\n",len);        else printf("My king, at most %d roads can be built.\n\n",len);           }    return 0;}


0 0