poj 1631 Bridging signals (DP_最長遞增子序列nlogn)

来源:互联网 发布:沙驰皮鞋 知乎 编辑:程序博客网 时间:2024/05/22 16:14
題目大意:給定1個序列,不會重復,x出現在y位置,即代表x與y可以連線。最後要從這個序列中儘量多地選擇連線並保證連線不交叉。#include <cstdio>#include <cstring>#include <algorithm>using namespace std;#define MAXN    40001int 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;}