hdoj 1025 Constructing Roads In JGShining'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 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 call them poor cities). Each poor city is short of exactly one kind of resource and also each rich city is rich in exactly one kind of resource.
You may assume no two poor cities are short of one same kind of resource and no two rich cities are rich in one same kind of resource.

With the development of industry, poor cities wanna import resource from rich ones. The roads existed are so small that they‘re unable to ensure the heavy trucks, so new roads should be built. The poor cities strongly BS each other, so are the rich ones. Poor
cities don‘t wanna build a road with other poor ones, and rich ones also can‘t abide sharing an end of road with other rich ones. Because of economic benefit, any rich city will be willing to export resource to any poor one.

Rich citis marked from 1 to n are located in Line I and poor ones marked from 1 to n are located in Line II.

The location of Rich City 1 is on the left of all other cities, Rich City 2 is on the left of all other cities excluding Rich City 1, Rich City 3 is on the right of Rich City 1 and Rich City 2 but on the left of all other cities ... And so as the poor ones.

But as you know, two crossed roads may cause a lot of traffic accident so JGShining has established a law to forbid constructing crossed roads.

For example, the roads in Figure I are forbidden.

In order to build as many roads as possible, the young and handsome king of the kingdom - JGShining needs your help, please help him. ^_^

Input

Each test case will begin with a line containing an integer n(1 ≤ n ≤ 500,000). Then n lines follow. Each line contains two integers p and r which represents that Poor City p needs to import resources from Rich City r. Process to
the end of file.

Output

For each test case, output the result in the form of sample.

You should tell JGShining what‘s the maximal number of road(s) can be built.

Sample Input

2
1 2
2 1
3
1 2
2 3
3 1

Sample Output

Case 1:
My king, at most 1 road can be built.

Case 2:
My king, at most 2 roads can be built.

Hint

Huge input, scanf is recommended.

分析:传统的o(n2)的肯定会超时,所以用一种O(nlgn)的算法。主要是用了二分查找。。

关于这样的算法http://www.cnblogs.com/dongsheng/archive/2013/01/25/2876323.html这个讲的非常好。

代码:

#include <stdio.h>
#include <string.h>
#include <algorithm>
#define  M 500005
using namespace std;

struct node{
    int p, r;
}s[M];
int d[M];

int cmp(node a, node b){
    return a.p<b.p;
}

int bis(int s, int len){
    int right = len, left = 0, mid;
    while(left <= right){
        mid = (left+right)>>1;
        if(d[mid]>s) right = mid-1;
        else if(d[mid] < s) left = mid+1;
        else return mid;
    }
    return left;
}
int main(){
    int n, v=1;
    while(scanf("%d", &n) == 1){
        memset(d, 0, sizeof(d));
        int i, len;
        for(i = 0; i < n; i ++)
            scanf("%d%d", &s[i].p, &s[i].r);
        sort(s, s+n, cmp);
        len = 1;
        d[len] = s[0].r;
        for(i = 1; i < n; i ++){
            int t = bis(s[i].r, len);
            d[t] = s[i].r;
            if(t > len)
                len++;
        }
        printf("Case %d:\n", v++);
        printf("My king, at most %d road", len);
        if(len > 1) printf("s");
        printf(" can be built.\n\n");
    }
    return 0;
}

hdoj 1025 Constructing Roads In JGShining's Kingdom 【最长递增子序列】

时间: 2024-08-03 10:30:31

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

HDU 1025 Constructing Roads In JGShining&amp;#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

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 ACM 1025 Constructing Roads In JGShining&amp;#39;s Kingdom-&amp;gt;二分求解LIS+O(NlogN)

#include<iostream> using namespace std; //BFS+优先队列(打印路径) #define N 500005 int c[N]; int dp[N]; //dp[i]保存的是长度为i的最长不降子序列的最小尾元素 int BS(int n,int x) //二分查找下标,当x比全部元素小时下标为1,比全部元素大时下标为n+1. { int low,high,mid; low=1,high=n; while(low<=high) { mid=(low+h

hdu1025 Constructing Roads In JGShining&amp;#39;s Kingdom (nlogn的LIS)

pid=1025">题目链接 第一次写nlogn复杂度的LIS,纪念一下. 题目意思是说.有两条平行线,两条平行线都有n个城市,都是从左到右标记为1--n,一条线上是富有城市,一个是贫穷城市.输入n,接下来有n行,p,r表示穷城市p和富有城市r 之间能够建一条路(p的顺序是1--n,一个贫穷城市仅仅相应一个富有城市(弱爆的语文描写叙述能力T_T)).公路不能交叉. 问最多能够建多少条公路. 在别处看到的对nlogn解法的解释吧算是: 时间复杂度:(NlogN): 除了算法一的定义之外.添加

hdu1025 Constructing Roads In JGShining&amp;#39;s Kingdom(二分+dp)

转载请注明出处:http://blog.csdn.net/u012860063 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1025 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 a

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

这是最大上升子序列的变形,可并没有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--DP--(LIS算法)

题意:在马路两边分别有n个城市,给出期望的n条路用于连接两边的城市,但是要求路不能有交叉,求在期望的n条中路实际能保留下来的最大的条数 分析:这题很好 1.本题抽象出来的模型应该是求最长上升(不下降)子序列 2.LIS的 nlog(n)算法: O(n^2) 的算法是dp[i]保留以i结尾的最长上升子序列的长度,令k=dp[i],O(nlog(n))算法是从k的角度出发,设d(k)为在长度为 k 的序列中的最小的位置,即:d(k)=min(a[i]),其中 f[i]=k,然后二分,每次看a[i]是

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