HDU 1025 Constructing Roads In JGShining's Kingdom

HDU 1025 Constructing Roads In JGShining's Kingdom

题意:

给你n个富有的城市和n个贫穷的城市

然后给你n个连线(确保是一对一的连线)

然后让你求最多有多少条线在没有交叉的情况下同时存在

 

解题思路:

在一对一情况下,假设我们把一边的城市按照顺序进行排列

那么每一座城市对应的另一边的城市的编号就形成了一个序列

而只要求出这个序列的最长上升序列的长度,那么就是本题的解

 

求最长子序列O(nlogn)的模板如下:

c[1]=a[1].r;
        int len=1;
        for(int i=2;i<=n;++i)
        {
            if(a[i].r>c[len])
            {
                c[++len]=a[i].r;
            }
            else
            {
                int j=lower_bound(c+1,c+len+1,a[i].r)-c;
                c[j]=a[i].r;
            }
        }

其中c为最后的最长子序列的一种情况,len为最长子序列的长度

 

本题代码:

#include <bits/stdc++.h>
#define mem(a) memset(a,0,sizeof(a))
#define mem1(a) memset(a,-1,sizeof(a))
#define forn(i,n) for(int i=0;i<n;++i)
#define for1(i,n) for(int i=1;i<=n;++i)
#define IO std::ios::sync_with_stdio(false); std::cin.tie(0)
#define ll long long
#define LL long long
#define inf 0x3f3f3f3f
#define INF 0x3f3f3f3f3f3f3f3f
#define N 1000000
using namespace std;
const int maxn=5e5+50;
//ll gcd(ll a, ll b){return b ? gcd(b, a % b) : a;}
//ll lcm(ll a, ll b){return a * b / gcd(a, b);}

struct Node
{
    int p,r;
}a[maxn];
int b[maxn],c[maxn];

bool cmp(Node a,Node b)
{
    return a.p<b.p;
}

int main()
{
    int n,k;
    k=1;
    while(~scanf("%d",&n))
    {
        for1(i,n)
        {
            scanf("%d %d",&a[i].p,&a[i].r);
        }
        sort(a+1,a+n+1,cmp);
        c[1]=a[1].r;
        int len=1;
        for(int i=2;i<=n;++i)
        {
            if(a[i].r>c[len])
            {
                c[++len]=a[i].r;
            }
            else
            {
                int j=lower_bound(c+1,c+len+1,a[i].r)-c;
                c[j]=a[i].r;
            }
        }
        printf("Case %d:\n",k++);
        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;
}

ps:注意单数和复数的时候输出语句中的road的单复数形式,贼坑

posted @ 2020-10-27 16:33  小松QAQ  阅读(115)  评论(0编辑  收藏  举报