传送门biu~
因为给定序列是原序列排序后的最后一列字符,所以我们可以知道,每个字符在原序列中后一个字符的排名就是当前字符在给定序列中出现的位置。所以把每个字符按权为第一关键字,按后一个字符的排名为第二关键字排序。显然第一个字符一定是0,0的后一个字符(即原序列的第一个字符)可以通过在新序列中查询0的后一个字符的排名来获得;同理,可以用这种方式不断找下一个字符最终推出整个序列。时间复杂度O(n)。
#include<bits/stdc++.h>
using namespace std;
int n,m;
pair<int,int>a[200005];
int main(){
scanf("%d%d",&n,&m);
for(int i=0;i<=n;++i) scanf("%d",&a[i].first),a[i].second=i;
sort(a,a+n+1);
int now=a[0].second;
for(int i=1;i<=n;++i) printf("%d ",a[now].first),now=a[now].second;
return 0;
}