码迷,mamicode.com
首页 > 其他好文 > 详细

BZOJ 1046 [HAOI2007]上升序列

时间:2018-04-25 13:11:54      阅读:123      评论:0      收藏:0      [点我收藏+]

标签:动态规划

#include <cstdio> #include <string> #include <algorithm> const int N = 10005; int f[N], d[N], a[N], len, n; int read() { int x = 0, f = 1; char c = getchar(); while (!isdigit(c)) { if (c == ‘-‘) f = -1; c = getchar(); } while (isdigit(c)) { x = (x << 3) + (x << 1) + (c ^ 48); c = getchar(); } return x * f; } int max(int x, int y) { if (x >= y) return x; return y; } int find(int x) { int l = 1, r = len, res = 0; while (l <= r) { int mid = l + (r - l >> 1); if (d[mid] > x) res = mid, l = mid + 1; else r = mid - 1; } return res; } void fly(int x) { int last = 0; for (int i = 1; i <= n; ++i) { if (f[i] >= x && a[i] > last) { printf("%d ", a[i]); last = a[i], --x; if (!x) break; } } puts(""); } int main() { n = read(); for (int i = 1; i <= n; ++i) a[i] = read(); for (int i = n; i; --i) { int t = find(a[i]); f[i] = t + 1, len = max(len, f[i]); if (d[t+1] < a[i]) d[t+1] = a[i]; } int m = read(); while (m--) { int x = read(); if (x <= len) fly(x); else puts("Impossible"); } return 0; }

BZOJ 1046 [HAOI2007]上升序列

标签:动态规划

原文地址:http://blog.51cto.com/13719532/2107630

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!