题目:
Constructing Roads In JGShining's Kingdom
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 24446 Accepted Submission(s):
6968
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. ^_^
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.
sample.
You should tell JGShining what's the maximal number of road(s) can
be built.
1 2
2 1
3
1 2
2 3
3 1
My king, at most 1 road can be built.
My king, at most 2 roads can be built.
#include<iostream>
#include<algorithm>
#include<cstdio>
using namespace std;
const int maxn=;
const int inf=;
int p[maxn],dp[maxn];
int main()
{
int n,i,m=;
while (scanf("%d",&n)!=EOF){int q,r;m++;
for (i=;i<n;i++)
scanf("%d%d",&q,&r),p[q-]=r;
fill(dp,dp+n,inf); for(i=;i<n;i++)
*lower_bound(dp,dp+n,p[i])=p[i]; //每次更新的过程,由于fill了inf,所以如果当前ta为最大则直接加到数组最后一个!INF的后面
int len=lower_bound(dp,dp+n,inf)-dp;
printf("Case %d:\n",m);
if (len==)
printf("My king, at most 1 road can be built.\n");
else
printf("My king, at most %d roads can be built.\n",len);
printf("\n"); }
return;
}