记录编号 426378 评测结果 AAAAAAAAAA
题目名称 最长上升子序列 最终得分 100
用户昵称 GravatarkZime 是否通过 通过
代码语言 C++ 运行时间 0.002 s
提交时间 2017-07-17 18:29:39 内存使用 0.34 MiB
显示代码纯文本
# include <bits/stdc++.h>
# define MAXN 1032
using namespace std;

inline int gn() {
	char c = getchar();
	int k = 0, f = 1;
	for(; !isdigit(c); c = getchar()) if(c == '-') f = -1;
	for(; isdigit(c); c = getchar()) k = k * 10 + c - '0';
	return k * f;
}

int a[MAXN], h[MAXN], dp[MAXN], n, maxa, ans;

struct zkw {
	int M, x[MAXN << 1];
	zkw() {
		M = 1;
		memset(x, 0, sizeof(x));
	}
	void build(int N) {
		for(; M + 1 <= N; M <<= 1);
	}
	void ins(int o, int p) {
		x[o + M] = p;
		for(o = (o + M) >> 1; o; o >>= 1) {
			x[o] = max(x[o << 1 | 1], x[o << 1]);
		}
	}
	int que(int l, int r) {
		int ans = 0;
		for(l += M - 1, r += M + 1; l ^ r ^ 1; l >>= 1, r >>= 1) {
			if(~l & 1) ans = max(ans, x[l + 1]);
			if(r & 1) ans = max(ans, x[r - 1]);
		}
		return ans;
	}
}seg;

pair<int, int> tmp[MAXN];
int cnt;

inline void lsh() { 
    for(int i = 1; i <= n; i++) { 
        tmp[i] = make_pair(a[i], i);
    }
    sort(tmp + 1, tmp + n + 1);
    for(int i = 1; i <= n; i++) { 
        if(i == 1 || tmp[i].first != tmp[i - 1].first) cnt++;
        a[tmp[i].second] = cnt;
    }
}

int main() { 
# ifndef LOCAL
    freopen("lis1.in", "r", stdin);
    freopen("lis1.out", "w", stdout);
# endif
	n = gn();
	for(int i = 1; i <= n; i++) {
        a[i] = gn();
        maxa = max(a[i], maxa);
	}
    lsh();
	seg.build(cnt);
	for(int i = 1; i <= n; i++) {
		dp[i] = seg.que(1, a[i] - 1) + 1;
        ans = max(dp[i], ans);
        seg.ins(a[i], dp[i]);
	}
    printf("%d\n", ans);
}