2021-08-10 SSL 模拟赛 T3 (暴力版)
怎么还是没有标题??
本解法是暴力在时间复杂度边缘疯狂徘徊的蒟蒻。
最优解 (树状数组):
戳这里
题目描述
给出一个长度为n的序列A描述一个长度为n的全排列,Ai表示前i-1个有多少个比第i个数大。
请求出这个全排列
输入
第一行一个正整数n
第二行给出序列A
输出
对应的全排列
输入样例
3
0 0 1
输出样例
1 3 2
数据范围
30%:
2
<
=
n
<
=
20
2<=n<=20
2<=n<=20
100%:
2
<
=
n
<
=
8000
2<=n<=8000
2<=n<=8000
思路:
我们考虑倒推。
当我们从后往前处理到第 i 位时,此时第 i+1~n 的位置我们已将填好数了。
那么我们在 1~n 中就会剩下一些没有填上去的数,那么你认真思考会发现,该出要填的数就是剩下的数中第
a
i
+
1
a_i+1
ai+1 大的数,那么我们可以使用桶排序的思想在剩下的数中暴力找出第 ai+1 大的数填上去即可,同时将这个数标记为已经使用。
时间复杂度为
O
(
n
2
)
O(n^2)
O(n2)
代码:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<queue>
#include<cstring>
#include<ctime>
#define r register
#define rep(i,x,y) for(r ll i=x;i<=y;++i)
#define per(i,x,y) for(r ll i=x;i>=y;--i)
using namespace std;
typedef long long ll;
const ll V=1e4+100;
ll n,a[V],s[V],num[V],tot;
priority_queue<ll> q;
bool pd[10000];
ll in()
{
ll res=0,f=1;
char ch;
while((ch=getchar())<'0'||ch>'9')
if(ch=='-') f=-1;
res=res*10+ch-'0';
while((ch=getchar())>='0'&&ch<='9')
res=res*10+ch-'0';
return res*f;
}
void put(ll x)
{
if(x<0) putchar('-'),x=-x;
if(x>9) put(x/10);
putchar(x%10+48);
}
int main()
{
scanf("%lld",&n);
ll x=n;
rep(i,1,n) a[i]=in();
per(i,n,1)
{
ll now=0;
per(j,n,1)
{
if(now==a[i]&&!pd[j])
{
now=j;
pd[j]^=1;
break ;
}
if(!pd[j]) ++now;
}
s[i]=now;
}
rep(i,1,n) printf("%lld ",s[i]);
return 0;
}