比赛: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
}
posted @ 2021-08-18 21:58  ssl_lhj  阅读(25)  评论(0)    收藏  举报