hdu1025(nlogn的求非递减子序列)

来源:互联网 发布:淘宝外卖要实体店吗 编辑:程序博客网 时间:2024/06/15 00:31
/*****************************************Author      :Crazy_AC(JamesQi)Time        :2015File Name   :*****************************************/// #pragma comment(linker, "/STACK:1024000000,1024000000")#include <iostream>#include <algorithm>#include <iomanip>#include <sstream>#include <string>#include <stack>#include <queue>#include <deque>#include <vector>#include <map>#include <set>#include <stdio.h>#include <string.h>#include <math.h>#include <stdlib.h>#include <limits.h>using namespace std;#define MEM(a,b) memset(a,b,sizeof a)#define pk push_backtemplate<class T> inline T Get_Max(const T&a,const T&b){return a < b?b:a;}template<class T> inline T Get_Min(const T&a,const T&b){return a < b?a:b;}typedef long long ll;typedef pair<int,int> ii;const int inf = 1 << 30;const int INF = 0x3f3f3f3f;const int MOD = 1e9 + 7;const int N = 500007;int city[N];int dp[N];int Search(int* dp,int len,int num){int low = 1,high = len;while(low <= high){int mid = (low + high) >> 1;if (num == dp[mid]) return mid;if (dp[mid] < num) low = mid + 1;else high = mid - 1;}return low;}int main(){// ios::sync_with_stdio(false);// freopen("in.txt","r",stdin);// freopen("out.txt","w",stdout);int n;int kase = 1;while(~scanf("%d",&n)){int a,b;for (int i = 1;i <= n;++i){scanf("%d%d",&a,&b);city[a] = b;}dp[0] = -1;dp[1] = city[1];int len = 1;for (int i = 1;i <= n;i++){if (dp[len] < city[i]) dp[++len] = city[i];else{int j = Search(dp,len,city[i]);dp[j] = city[i];}}printf("Case %d:\n",kase++);if (len == 1) printf("My king, at most %d road can be built.\n\n",len);else printf("My king, at most %d roads can be built.\n\n",len);}return 0;}


0 0
原创粉丝点击