题目链接:https://vjudge.net/contest/148584#problem/A
题目大意:
解题思路:
题目要求为:输出与已知序列的每一个元素的f(i)(f(i)的定义如题)相同的字典序最小的序列。稍微思考便知,其实就是叫我们求出原序列的f(i),这个很容易做到,只要在最长上升子序列的模板题上稍微做一些改动,记录下原序列每一个元素的f(i)即可。具体实现见代码。
#include <cstdio> #include <algorithm> using namespace std; int b[100005], c[100005]; int n; int main() { int t, data; scanf("%d", &t); while (t--) { scanf("%d", &n); int num = 0; for (int i = 1; i <= n; i++) { scanf("%d", &data); if (i == 1) b[++num] = data, c[1] = 1; //b[]数组的个数是以i为末尾的最长子序列长度,b[]数组内元素为此时组成最长上升子序列的元素 else if (data>b[num]) b[++num] = data, c[i] = num; else { int k = lower_bound(b + 1, b + 1 + num, data) - b; //二分查找函数,查找大于data的第一个元素的位置 b[k] = data; c[i] = k; //c[i]记录的是以i为末尾的最长子序列长度 } } for (int i = 1; i<n; i++) printf("%d ", c[i]); printf("%d\n", c[n]); } return 0; }
2018-04-29