思路:读懂题目之后就是一个裸的nlogn的LIS模板题
#include<bits\stdc++.h>
using namespace std;
const int maxn = 50005;
int a[maxn],b[maxn];
int bin_search(int aim,int low,int high)
{
while(low<=high)
{
int m = (low+high)>>1;
if(aim > b[m])
low=m+1;
else
high = m-1;
}
return low;
}
int LIS(int a[],int n)
{
int len = 0,pos;
for(int i = 1;i<=n;i++)
{
if(a[i]>b[len]||len==0)
{
len++;
b[len]=a[i];
}
else
{
pos = bin_search(a[i],0,len);
b[pos]=a[i];
}
}
return len;
}
int main()
{
int n,cas=1;
while(scanf("%d",&n)!=EOF)
{
for(int i = 1;i<=n;i++)
{
int p,t;
scanf("%d%d",&p,&t);
a[p]=t;
}
int ans = LIS(a,n);
if(ans==1)
printf("Case %d:\nMy king, at most %d road can be built.\n\n",cas++,ans);
else
printf("Case %d:\nMy king, at most %d roads can be built.\n\n",cas++,ans);
}
}