17/100
发布文章
有n(n <= 105)头奶牛,已知他们身高为1~n且个不相同, 但不知道奶牛的具体身高。现在这n头奶牛站成一列,已知第i头奶牛前面有a[i]头奶牛比他低,求每头奶牛的身高;
对于最后一头牛,显然H[n] = a[n] + 1;
对于第k头牛,他的身高应该是1到n中第ak+1小的没有在hk到hn中出现的数 (不要问我怎么知道的,这是书上写的,我看半天没看懂,tmd自己有花了个图才勉强看出来的) ,,,,
然后就是树状数组加二分查询了
树状数组全部初始化为1,每找到一个答案就标记一下
#pragma G++ optimize(2)
#pragma GCC optimize(2)
#include<iostream>
#include<algorithm>
#include<stack>
#include<vector>
#include<iostream>
#include<climits>
#include<queue>
#include<cassert>
#include<iomanip>
#include<cmath>
#include<bitset>
#include<string>
#include<cstdio>
#include<cstring>
#define _rep(i, a, b) for(int i = (a); i <=
(b); ++i)
#define _rev(i, a, b) for(int i = (a); i >=
(b); --i)
#define _for(i, a, b) for(int i = (a); i <(b);
++i)
#define maxn 8009
#define maxm 49
#define ll long long
#define met(a,b)
memset((a),(b), sizeof(a))
#define db double
#define eps 1e-8
#define lowbit(x) (x)&(-x)
#define mod 105
using namespace std;
int n, num[maxn], t[maxn], ans[maxn];
void add(int x, int v) {
for (; x <= n; x += lowbit(x)) t[x] += v;
}
int ask(int i) {
int ret = 0;
for (; i; i -= lowbit(i)) ret += t[i];
return ret;
}
int
binary_(int v) {
int l = 1, r = n;
while (l < r)
{
int mid = (l + r)
>> 1;
ask(mid)
< v ? l = mid + 1 : r =
mid;
}
return l;
}
int main()
{
ios::sync_with_stdio(0);
cin
>> n;
add(1,
1);
_rep(i, 2, n) {
cin
>> num[i];
add(i,
1);
}
_rev(i, n, 1) {
ans[i]
= binary_(num[i] + 1);//二分寻位
add(ans[i],
-1);//标记已经出现过了
}
_rep(i, 1, n)cout << ans[i] << endl;
}