题目链接:点击打开链接
题目是给你匹配对,第i个穷人城市需要第j个富人城市的帮助,穷人与富人城市是平行线,要求不能有交叉,比如1—>2,2->1是不行的,求最多能被帮助的城市数量。
思路:可看成LIS问题。
代码是别人的模板代码
#include <iostream>
#include<cstdio>
using namespace std;
const int maxn=500000+10;
int Arr[maxn],List[maxn];
int Stack[maxn];
int LIS(int *Arr,int N)
{
int top = 0;
Stack[top] = -1;
for(int i = 1; i <= N; ++i)
{
if(Arr[i] > Stack[top])
Stack[++top] = Arr[i];
else
{
int low = 1;
int high = top;
while(low <= high)
{
int mid = (low + high)/2;
if(Arr[i] > Stack[mid])
low = mid + 1;
else
high = mid - 1;
}
Stack[low] = Arr[i];
}
}
return top;
}
int main()
{
int ans,i,j,n,a,b;
ans=0;
while(~scanf("%d",&n))
{
for(i=0;i<n;i++)
{
scanf("%d %d",&a,&b);
Arr[a]=b;
}
int k=LIS(Arr,n);
if(k==1)
printf("Case %d:\nMy king, at most %d road can be built.\n\n",++ans,k);
else printf("Case %d:\nMy king, at most %d roads can be built.\n\n",++ans,k);
}
return 0;
}