| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
非常无聊的用线段树写了一个……0MS#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
const int MAXN = 10010;
struct node {
int a, id;
bool operator < (const node & b) const {
return a != b.a ? a < b.a : id < b.id;
}
} a[MAXN];
int dp[MAXN<<2];
int lch[MAXN<<2], rch[MAXN<<2];
int sz;
void build(int l, int r, int rt) {
if(l == r) {
dp[rt] = 0;
return;
}
dp[rt] = 0;
int m = (l + r) >> 1;
lch[rt] = ++ sz;
rch[rt] = ++ sz;
build(l, m, lch[rt]); build(m+1, r, rch[rt]);
}
void pushup(int rt) {
dp[rt] = max(dp[lch[rt]], dp[rch[rt]]);
}
void update(int p, int c, int l, int r, int rt) {
if(l == r) {
dp[rt] = c;
return;
}
int m = (l + r) >> 1;
if(p <= m) update(p, c, l, m, lch[rt]);
else update(p, c, m+1, r, rch[rt]);
pushup(rt);
}
int query(int L, int R, int l, int r, int rt) {
if(L <= l && r <= R) {
return dp[rt];
}
int m = (l + r) >> 1;
int ret = -0x3f3f3f3f;
if(L <= m) ret = max(ret, query(L, R, l, m, lch[rt]));
if(R > m) ret = max(ret, query(L, R, m+1, r, rch[rt]));
return ret;
}
int n;
pair<int,int> sta[MAXN];
int top;
int main() {
int n;
while(~scanf("%d", &n)) {
for(int i=1; i<=n; i++) scanf("%d", &a[i].a), a[i].id = i;
sort(a+1, a+n+1);
sz = 1;
build(0, n, 1);
int ans = 0, top = 0;
for(int i=1; i<=n; i++) {
//update(a[i].id, tmp, 0, n, 1);
if(a[i].a > a[i-1].a) {
while(top) {
-- top;
update(sta[top].first, sta[top].second, 0, n, 1);
}
}
int tmp = query(0, a[i].id-1, 0, n, 1) + 1;
ans = max(ans, tmp);
sta[top++] = make_pair(a[i].id, tmp);
}
printf("%d\n", ans);
}
return 0;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator