2 条题解
-
0
#include <bits/stdc++.h> using namespace std; const int N = 1e5 + 10; int n, a[N], bn, b[N], f[N], c[N]; void upd(int x, int k) { for (; x >= 1; x -= x & -x) { c[x] = max(c[x], k); } } int ask(int x) { int res = 0; for (; x <= bn; x += x & -x) { res = max(res, c[x]); } return res; } int main() { scanf("%d", &n); for (int i = 1; i <= n; i++) { scanf("%d", &a[i]); b[i] = a[i]; } sort(b + 1, b + n + 1); bn = unique(b + 1, b + n + 1) - b - 1; for (int i = 1; i <= n; i++) { a[i] = lower_bound(b + 1, b + bn + 1, a[i]) - b; } memset(c, 0, sizeof(c)); for (int i = n; i >= 1; i--) { f[i] = ask(a[i] + 1) + 1; upd(a[i], f[i]); } int maxlen = ask(1); printf("%d\n", maxlen); return 0; } -
0
#include<bits/stdc++.h> using namespace std; const int N=1e5+10; int n,a[N],bn,b[N],f[N],c[N]; void upd(int x,int k){for(;x>=1;x-=x&-x)c[x]=max(c[x],k);} int ask(int x) { int res=0; for(;x<=bn;x+=x&-x)res=max(res,c[x]); return res; } int main() { scanf("%d",&n); for(int i=1;i<=n;i++)scanf("%d",&a[i]),b[i]=a[i]; sort(b+1,b+n+1); bn=unique(b+1,b+n+1)-b-1; for(int i=1;i<=n;i++)a[i]=lower_bound(b+1,b+bn+1,a[i])-b; memset(c,0,sizeof(c)); for(int i=n;i>=1;i--) { f[i]=ask(a[i]+1)+1; upd(a[i],f[i]); } int maxlen=ask(1); printf("%d\n",maxlen); return 0; }
- 1
信息
- ID
- 519
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- 7
- 标签
- 递交数
- 23
- 已通过
- 9
- 上传者