比赛:2021-08-10:C
题目大意
给出一个长度为\(n\)的序列\(A\)描述一个长度为\(n\)的全排列,\(A_i\)表示前\(i-1\)个有多少个比第\(i\)个数大。
题目分析
从后往前分析,当前\(a_i\)表示有几个数比当前位置的数大,那么当前应该选择的数一定是剩余数字中第\(a_i\)大的,暴力模拟匹配,时间复杂度\(O(n^2)\),可以过\(8000\)的数据范围。
\(Code\)
#include<iostream>
#include<cstdio>
#define Minecraft_never_die return 0;
#define sco 8010
#define getcha() (S==T&&(T=(S=fsr)+fread(fsr,1,1<<15,stdin),S==T)?EOF:*S++)
using namespace std;
int a[sco],ans[sco],vis[sco],n,tot(0);
char fsr[1<<15],*S=fsr,*T=fsr;
inline int read(){
int r(0),w(1);char ch;
while(ch=getcha(),ch>=58 || ch<=47)w=(ch=='-'?-1:1);r=(r<<3)+(r<<1)+ch-48;
while(ch=getcha(),ch<=57 && ch>=48)r=(r<<3)+(r<<1)+ch-48;
return r*w;
}
int main(){
n=read();
for(int i=1;i<=n;++i){
a[i]=read();
}
for(int i=n;i>0;--i){
int tmp(n);
for(int j=a[i];j>0 || vis[tmp]==1;--j){
if(vis[tmp])++j;
--tmp;
}
vis[tmp]=1;
ans[i]=tmp;
}
for(int i=1;i<=n;++i){
printf("%d ",ans[i]);
}
Minecraft_never_die
}