[ACM] hdu 1025 Constructing Roads In JGShining's Kingdom (最长递增子序列,lower_bound使用)

来源:互联网 发布:嘉实优化红利混合好吗 编辑:程序博客网 时间:2024/05/16 15:45

Constructing Roads In JGShining's Kingdom

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 14635    Accepted Submission(s): 4158


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

 

21 22 131 22 33 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.
 
 
解题思路:

这题用来练lower_bound函数的使用。

这个函数从已排好序的序列a中利用二分搜索找出指向ai>=k的ai的最小的指针。类似的函数含有upper_bound,这一函数求出的是指向ai>k的ai的最小的指针。有了它们,比如长度为n的有序数组a中的k的个数,可以这样求出

upper_bound(a,a+n,k) - lower_bound(a,a+n,k);

参考资料:http://www.cnblogs.com/cobbliu/archive/2012/05/21/2512249.html

代码:

#include <iostream>#include <stdio.h>#include <algorithm>#include <string.h>using namespace std;//int dp[20];const int inf=0x7fffffff;//int a[7]={2,1,3,4,8,5,9};const int maxn=500005;int road[maxn];int dp[maxn];int main(){    /*fill(dp,dp+7,inf);    for(int i=0;i<7;i++)        cout<<dp[i]<<endl;    for(int i=0;i<7;i++)    {        *lower_bound(dp,dp+7,a[i])=a[i];    }    int len=lower_bound(dp,dp+7,inf)-dp;    for(int i=0;i<len;i++)        cout<<dp[i]<<endl;*/    int n;    int from,to;    int c=1;    while(scanf("%d",&n)!=EOF)    {        fill(dp,dp+n,inf);        for(int i=0;i<n;i++)        {            scanf("%d%d",&from,&to);            road[from]=to;        }        for(int i=1;i<=n;i++)//因为题目输入的原因,这里的下标从1开始。            *lower_bound(dp,dp+n,road[i])=road[i];        int len=lower_bound(dp,dp+n,inf)-dp;        if(len==1)        {            cout<<"Case "<<c++<<":"<<endl;            cout<<"My king, at most 1 road can be built."<<endl;        }        else        {            cout<<"Case "<<c++<<":"<<endl;            cout<<"My king, at most "<<len<<" roads can be built."<<endl;        }        cout<<endl;    }    return 0;}


 附上最长上升子序列的模板:

#include <iostream>#include <stdio.h>#include <algorithm>#include <string.h>using namespace std;int dp[20];const int inf=0x7fffffff;int a[7]={2,1,3,4,8,5,9};const int maxn=500005;int main(){    fill(dp,dp+7,inf);    for(int i=0;i<7;i++)    {        *lower_bound(dp,dp+7,a[i])=a[i];    }    int len=lower_bound(dp,dp+7,inf)-dp;    for(int i=0;i<len;i++)        cout<<dp[i]<<endl;    return 0;}


 

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 人感染了镰刀菌怎么办 40年土地到期后怎么办 土地70年到期后怎么办 极速6k出现闪退怎么办 苹果手机ld锁了怎么办 苹果手机ld被锁怎么办 苹果6太卡了怎么办 东风31泄密案该怎么办 小孩子眼睛近视怎么办才能好起来 u盘丢了没有加密怎么办 公司u盘丢了怎么办 掏耳朵后耳朵痛怎么办 辐射4基地被攻击怎么办 宝珀50噚表带大怎么办 颈如何部皱纹多怎么办 cvt变速箱油少了怎么办 上膛疼 咽唾沫疼怎么办 大便把马桶堵了怎么办 马桶堵了怎么办最简单 马桶堵的水满了怎么办 直冲式马桶堵了怎么办 天梭手表不走了怎么办 机械表老是快该怎么办 机械表有误差 那怎么办 机械表走的快怎么办 新车加了燃油宝怎么办 车离合器片烧了怎么办 车的离合片烧了怎么办 鱼缸没电了缺氧怎么办 水箱的浮球失灵怎么办 鱼缸底滤停电1天怎么办 底滤鱼缸声音大怎么办 马桶提升泵坏了怎么办 汽车前玻璃起雾怎么办 下雨车玻璃起雾怎么办 车玻璃外面起雾怎么办 汽车内玻璃起雾怎么办 汽车前挡风起雾怎么办 车窗内玻璃起雾怎么办 早晨车玻璃起雾怎么办 开空调玻璃起雾怎么办