题目大意就是要求最长不降子序列,n比较大,用n*n算法肯定超时,所有采用nlogn算法。
代码:
#include<stdio.h>
#include<string.h>
int a[500001],d[500001],n;
int Binsearch(int key,int* d,int left,int right)
{
int mid;
while(left<=right)
{
mid=(left+right)/2;
if(d[mid]<key)
{
if(d[mid+1]>key) return mid;
else left=mid+1;
}
else
right=mid-1;
}
return 0;
}
int main()
{
int x,y;
int i,j,len;
int count=1;
while(scanf("%d",&n)!=EOF)
{
memset(a,0,sizeof(a));
memset(d,0,sizeof(d));
for(i=0;i<n;i++)
{
scanf("%d%d",&x,&y);
a[x]=y;
}
len=1;
d[len]=a[1];
for(i=2;i<=n;i++)
{
if(a[i]>d[len])
{
len++;
d[len]=a[i];
}
else
{
j=Binsearch(a[i],d,1,len);
j++;
d[j]=a[i];
}
}
printf("Case %d:\n",count);
count++;
if(len==1)
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 0;
}