題目大意:給定1個序列,不會重復,x出現在y位置,即代表x與y可以連線。最後要從這個序列中儘量多地選擇連線並保證連線不交叉。
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define MAXN 40001
int v[MAXN], f[MAXN], idx;
int binary_search(int x)
{
int l(0), r(idx-1), m;
if( !idx || x > f[idx-1] ) {
f[idx ++] = x; return idx;
}
while( l <= r ) {
m = (l+r)>>1;
if( f[m] < x ) {
l = m+1;
}
else if( f[m] > x ) {
r = m-1;
}
}
if( l >= 0 && l < idx ) {
f[l] = x; return idx;
}
if( r >= 0 && r < idx ) {
f[r] = x; return idx;
}
}
int main(int argc, char const *argv[])
{
#ifndef ONLINE_JUDGE
freopen("test.in", "r", stdin);
#endif
int cas, n, rst;
scanf("%d", &cas);
for( ; cas; cas --) {
scanf("%d", &n); rst = idx = 0;
for(int i = 1; i <= n; i ++) {
scanf("%d", &v[i]);
}
for(int i = 1; i <= n; i ++) {
rst = max(rst, binary_search(v[i]));
}
printf("%d\n", rst);
}
return 0;
}