http://acm.hdu.edu.cn/showproblem.php?pid=1025 备忘!! #include<iostream> using namespace std; #define N 500001 int dp[N]; int a[N]; int main(void) { int n,k=1; while(~scanf("%d",&n)) { int i; for(i=0;i<n;i++) { int x,y; scanf("%d%d",&x,&y); a[x]=y; } memset(dp,0,sizeof(dp)); int ans=1; dp[1]=a[1]; for(i=2;i<=n;i++) { int f=1,l=ans; while(f<=l) { int mid=(f+l)>>1; if(a[i]<=dp[mid]) l=mid-1; else f=mid+1; } dp[f]=a[i]; if(f>ans) ans++; } printf("Case %d:/nMy king, at most %d road",k++,ans); if(ans!=1) printf("s"); printf(" can be built./n/n"); } }