hdu 5748 Bellovin【最长上升子序列】
题目链接:https://vjudge.net/contest/148584#problem/A
题目大意:
解题思路:
题目要求为:输出与已知序列的每一个元素的f(i)(f(i)的定义如题)相同的字典序最小的序列。稍微思考便知,其实就是叫我们求出原序列的f(i),这个很容易做到,只要在最长上升子序列的模板题上稍微做一些改动,记录下原序列每一个元素的f(i)即可。具体实现见代码。
#include <bits/stdc++.h> using namespace std; const int N = 1e5+5; int rise[N],ans[N]; int n; int main(){ int T;scanf("%d",&T); while(T--){ scanf("%d",&n); int len=0;rise[0]=-1; for(int i=1;i<=n;i++){ int data;scanf("%d",&data); if(data>rise[len])rise[++len]=data,ans[i]=len; //记录以i为末尾的最长上升子序列的长度 else { int loc=lower_bound(rise+1,rise+1+len,data)-rise; //最长上升子序列用lower_bound rise[loc]=data; ans[i]=loc; //记录以i为末尾的最长上升子序列的长度 } } for(int i=1;i<=n;i++) i==n?printf("%d\n",ans[i]):printf("%d ",ans[i]); } }
作者:is_ok
出处:http://www.cnblogs.com/00isok/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。