http://acm.hdu.edu.cn/showproblem.php?pid=1025
利用贪心+二分去做,复杂度O(nlogn)
#define N 500005
int a[N],dp[N];//dp[len]表示长度为len的序列最后一个的最小值
int main(){FRE;
int n;
int ca= 1;
while(scanf("%d",&n)!=-1){
int i,j;
for(i=0;i<n;i++){
int x,y;
scanf("%d%d",&x,&y);
a[x] = y;
}
dp[1] = a[1];
int len = 1;
for(i=2;i<=n;i++){
int l = 1,r = len;
while(l<=r){
int mid = (l+r)>>1;
if(a[i]<dp[mid])r = mid-1;
else if(a[i]>dp[mid])l = mid+1;
}
dp[l] = a[i];
if(l>len)len++;
}
if(len<=1)
printf("Case %d:\nMy king, at most %d road can be built.\n\n",ca++,len);
else printf("Case %d:\nMy king, at most %d roads can be built.\n\n",ca++,len);
}
return 0;
}