题目链接:https://vjudge.net/problem/Gym-101669K
参考:https://blog.csdn.net/wxh010910/article/details/80933610
题意:给你一串n位数字,表明从此位置开始的最长上升序列的长度,注意序列不一定连续,输出字典序最小的原序列。
思路:给每一位数字分配id表明第几位,val表明上升序列的长度,先按上升序列长度升序排序,则可以从n开始给上升序列长度为1、2、3赋值,这样一定是字典序最小的,再按id排序,输出答案。
#include <bits/stdc++.h>
using namespace std;
struct node
{
int id,val,ans;
bool operator <(node &s)
{
if(val!=s.val)
return val<s.val;
return id<s.id;
}
};
bool cmp(node &a,node &b)
{
return a.id<b.id;
}
int main()
{
int n;
vector <node> v;
node u;
scanf("%d",&n);
for(int i=1; i<=n; i++)
{
scanf("%d",&u.val);
u.id=i;
v.push_back(u);
}
sort(v.begin(),v.end());
for(int i=0; i<n; i++)
{
v[i].ans=n-i;
}
sort(v.begin(),v.end(),cmp);
for(int i=0; i<n; i++)
{
if(i)
printf(" ");
printf("%d",v[i].ans);
}
return 0;
}