您的位置:首页 > 其它

POJ 1631 Bridging signals

2016-08-02 20:37 316 查看
/*	2016年8月2日20:02:31
就是求一个数列的最长上升子序列

nlogn 算法
把最长的上升子序列 存进 sequence[]数组
len[i] 表示在前i个数中 最长的上升子序列的长度
详见代码
*/

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <queue>
#include <vector>
#include <cmath>
#include <stack>
#include <map>
#include <set>
#define pi acos(-1)
#define LL long long
#define INF 0x3f3f3f3f
using namespace std;
const int maxn = 1e5 + 5;

int a[maxn];
int seq[maxn];
int len[maxn];
int main(void)
{
//	freopen("C:\\Users\\wave\\Desktop\\NULL.exe\\NULL\\in.txt","r", stdin);
int T, i, j, n, l, r, mid, ans;
cin >> T;
while (T--){
cin >> n;
for (i = 1; i <= n; i++)
scanf("%d", &a[i]);
memset(seq, INF, sizeof(seq));
seq[1] = a[1];
len[1] = 1;
for (i = 2; i <= n; i++){
l = 1; r = n;
while (l <= r){
mid = (l + r)/2;
if (a[i] >= seq[mid])
l = mid + 1;
else r = mid - 1;
}
seq[l] = a[i];
len[i] = l;
}
ans = 0;
for (i = 1; i <= n; i++)
ans = max(ans, len[i]);
cout << ans << endl;
}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: