hdu 1025 Constructing Roads In JGShining's Kingdom(二分法+最长上升子序列)

题目大意:河的两岸有两个不同的国家,一边是穷国,一边是富国,穷国和富国的村庄的标号是固定的,穷国要变富需要和富国进行交流,需要建桥,并且建的桥不能够有交叉。问最多可以建多少座桥。

     思路:建路时如下图所示

                当一边的点已经固定了的时候,另外一边按照从小到大的序列与当前的边连接,得到最少的交叉。

          题目给的第二组测试数据,如果按照图一则可以建2座桥,图二建一座桥

3
1 2
2 3
3 1

                    

                        图一                                                                                                         图二

        一开始用的是一般的最长上升子序列,结果超时。后来想到之前poj做过的3903 Stock Exchange(二分法),当时也是超时后来用的是二分法做的就过了。又敲了一遍代码还是没有过,提示的是超时。看了讨论区以后发现输出格式不对,存在一条以上的路时road为复数roads。以前从来没有遇到这样的输出,这次也算是一次积累吧!改了以后还是超时。上网百度了一下人家的做法,发现了一个新的技巧,因为每一个点只有一个所以不用排序,输入的u
v可以直接用数组标记,line[u] = v;而我之前做的代码是先用sort函数将u排序后求解,时间变长。嗯,不错这又是一个好方法。

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
using namespace std;
#define  MAX 500005
int point[MAX];
int num, stack[MAX], top;
int main()
{
    int i, cnt, max, a, b;
    int low, high, mid;
    cnt = 0;
    while (scanf("%d", &num)!=EOF)
    {
       cnt++;
       max = 0;
       for (i=0; i<num; i++)
       {
           scanf("%d%d", &a, &b);
           point[a] = b;//不用排序
       }
        top = 0;
        stack[0] = -1;
        for (i=1; i<=num; i++)
        {
            if (top==0 || point[i]>stack[top])
            {
                top++;
                stack[top] = point[i];
            }
            else
            {
                low = 0;
                high = top;
                while (low <= high)
                {
                       mid = (high+low) / 2;
                    if (point[i] > stack[mid])
                        low = mid + 1;
                    else
                        high = mid - 1;
                }
                stack[low] = point[i];
            }
        }
        if (top==1)
            printf("Case %d:\nMy king, at most %d road can be built.\n\n", cnt, top);
        else
             printf("Case %d:\nMy king, at most %d roads can be built.\n\n", cnt, top);
    }
    return 0;
}

         转载请注明出处:http://blog.csdn.net/u010499449

hdu 1025 Constructing Roads In JGShining's Kingdom(二分法+最长上升子序列)

时间: 2024-08-07 04:24:04

hdu 1025 Constructing Roads In JGShining's Kingdom(二分法+最长上升子序列)的相关文章

hdu 1025 Constructing Roads In JGShining&#39;s Kingdom(最长上升子序列nlogn算法)

学习了最长上升子序列,刚开始学的n^2的方法,然后就超时了,肯定超的,最大值都是500000,平方之后都12位 了,所以又开始学nlogn算法,找到了学长党姐的博客orz,看到了rating是浮云...确实啊,这些不必太关 注,作为一个动力就可以啦.没必要看的太重,重要的事学习知识. 思路: 这道题目可以先对一行排序,然后对另一行求最长上升子序列... n^2算法: 序列a[n],设一个数组d[n]表示到n位的时候最长公共子序列(此序列包括n),所以呢 d[n]=max(d[j]+1,0<j<

hdoj 1025 Constructing Roads In JGShining&#39;s Kingdom 【最长递增子序列】

Constructing Roads In JGShining's Kingdom Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 16262    Accepted Submission(s): 4633 Problem Description JGShining's kingdom consists of 2n(n is no mo

HDU 1025 Constructing Roads In JGShining&#39;s Kingdom   LIS 简单题 好题 超级坑

Constructing Roads In JGShining's Kingdom Problem Description JGShining's kingdom consists of 2n(n is no more than 500,000) small cities which are located in two parallel lines. Half of these cities are rich in resource (we call them rich cities) whi

HDU 1025 Constructing Roads In JGShining&#39;s Kingdom (DP)

Problem Description JGShining's kingdom consists of 2n(n is no more than 500,000) small cities which are located in two parallel lines. Half of these cities are rich in resource (we call them rich cities) while the others are short of resource (we ca

HDU 1025 Constructing Roads In JGShining&#39;s Kingdom

这是最大上升子序列的变形,可并没有LIS那么简单. 需要用到二分查找来优化. 看了别人的代码,给人一种虽不明但觉厉的赶脚 直接复制粘贴了,嘿嘿 原文链接: http://blog.csdn.net/ice_crazy/article/details/7536332 假设存在一个序列d[1..9] = 2 1 5 3 6 4 8 9 7,可以看出来它的LIS长度为5.下面一步一步试着找出它.我们定义一个序列B,然后令 i = 1 to 9 逐个考察这个序列.此外,我们用一个变量Len来记录现在最长

HDU 1025 Constructing Roads In JGShining&#39;s Kingdom LIS题解

本题是LIS题解.主要是理解他的题意.他的题意都好像比较隐晦,比如每个poor city和rich city一定是需要对应起来的,比如poor city和rich city并不是按顺序给出的. 其实是可以把数列按照poor city排序,然后求rich city城市号的最大递增子序列. 不过这里不用排序,利用hash的思想直接对应起来就可以了. 然后就是本题是卡DP的O(n*n)的解法的,这里需要O(nlgn)的LIS解法. 二分好已经找到的递增序列,插入新的数值就可以了.是利用了一个单调队列的

HDU 1025 Constructing Roads In JGShining&#39;s Kingdom(二维LIS)

Constructing Roads In JGShining's Kingdom Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 23467    Accepted Submission(s): 6710 Problem Description JGShining's kingdom consists of 2n(n is no mo

hdu 1025 Constructing Roads In JGShining&#39;s Kingdom(DP + 二分)

此博客为转发 Constructing Roads In JGShining's Kingdom Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Problem Description JGShining's kingdom consists of 2n(n is no more than 500,000) small cities which are located in t

HDU 1025 Constructing Roads In JGShining&#39;s Kingdom(构建道路:LIS问题)

HDU 1025 Constructing Roads In JGShining's Kingdom(构建道路:LIS问题) http://acm.hdu.edu.cn/showproblem.php?pid=1025 题意: 有2n个点分布在平行的两条直线上, 上面那条是富有城市的1到n个点(从左到右分布), 下面那条是贫穷城市1到n个点(从左到右分布). 现在给出每个贫穷城市需要连接的富有城市的编号, 即(i,j)表示i贫穷城市只能连接j号富有城市 , 问你最多能构建几条贫穷城市到富有城市间