#include <iostream>
#include <algorithm>
#include <functional>
#include <string.h>
using namespace std;typedef long long ll;const int maxn = 1e5 + 7;
int dp[maxn];
int pos[maxn]; // 记录每个数在dp数组里出现的位置。唯一
int ans[maxn];
int arr[maxn];
int main() {
memset(dp, 0, sizeof(dp));int n;cin >> n;for (int i = 0; i < n; ++i) {
cin >> arr[i];}dp[1] = arr[0];int len = 1;for (int i = 1; i < n; ++i) {
if (arr[i] > dp[len]) {
dp[++len] = arr[i];pos[i] = len;}else {
int p = lower_bound(dp + 1, dp + 1 + len, arr[i]) - dp;dp[p] = arr[i];pos[i] = p;}}int t = len;for (int i = n - 1; i >= 0; --i) {
if (!len)break;if (pos[i] == len) {
ans[len] = i;--len;}}/*cout << "dp:\t";for (int i = 1; i <= n; ++i) {cout << dp[i] << " ";}cout << endl;cout << "pos:\t";for (int i = 0; i < n; ++i) {cout << pos[i] << " ";}cout << endl;*/for (int i = 1; i <= t; ++i) {
cout << arr[ans[i]] << " ";}return 0;
}
详细解决方案
最长上升子序列【nlogn+路径输出】
热度:89 发布时间:2023-12-16 22:17:10.0
相关解决方案
- 13.经典 O(nlogn) 复杂度算法之快排
- 最长上升子序列的长度的o(nlogn)算法
- 给定一个非空的整数数组,返回其中出现频率前 k 高的元素。要求时间复杂度优于O(nlogn)
- [python]实现几种O(nlogn)的排序算法
- HDU1950[Bridging signals] LIS模型 (nlogn)
- 进阶实验8-2.1 逆散列问题 (30分) 贪心不是最优解 时间复杂度为O(nlogn)的解法
- 例题才是最好的老师?算法时间复杂度O(1)、O(logn)、O(n)、O(nlogn)、O(n^2)、O(n^3)、O(2^n)、O(n阶乘)
- Codeforces 629 D Finals in arithmetic(最大上升子序列和,O(nlogn)、线段树/树状数组)
- POJ 2533 Longest Ordered Subsequence(最长上升子序列长度、O(nlogn))
- 小技巧-O(W)+O(nlogn)分解质因数
- [算法] poj 3903 最长上升子序列 dp vs (二分 nlogn)
- 算法学习—算法运行时间、logN、NlogN
- 最长上升子序列【nlogn+路径输出】
- “科林明伦杯”哈尔滨理工大学第十届程序设计竞赛——E.赛马【贪心 nlogn】
- LCS(最长公共子序列)及其O(n)空间优化,O(nlogn)时间复杂度优化
- POJ 1631 Bridging signals 最长上升子序列小结 LIS的O(nlogn)算法
- 求最长上升子序列O(nlogn)
- POJ 2085 treap O(nlogn) 与 贪心 O(n)算法
- OpenJ_Bailian - 2757 最长上升子序列(O(n2)算法和O(nlogn)算法)
- 排序算法-希尔排序(nlogn)
- 排序算法-堆排序(nlogn)
- 排序算法-快速排序(nlogn)
- 排序算法-归并排序(nlogn)
- 最长上升子序列LIS(动态规划+二分搜索)nlogn
- 【面试】单链表排序,时间复杂度O(nlogn)、空间复杂度O(1)
- 时间复杂度 O(1),O(n),O(n^2),O(logn),O(nlogn) 详解
- O(nlogn)的一般排序方法
- 求逆序对数目___O(nlogn) —— 分治 归并
- UVA 10534 - Wavio Sequence - (DP,最长单调上升子序列O(nlogn))
- 基于比较的排序算法的最坏情况下的最优下界为什么是O(nlogn)