题目链接: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 ",ans[i]):printf("%d ",ans[i]); } }