谜一样的牛
题意:有n头奶牛,已知它们的身高为 1~n 且各不相同,但不知道每头奶牛的具体身高。现在这n头奶牛站成一列,已知第i头牛前面有Ai头牛比它低,求每头奶牛的身高。
思路:第k头牛的身高hk为1~n中除掉hk+1,hk+2……hn中第Ak+1小的。所以可以维护一个01序列,当找其中的第ai+1个1,找完后把该位置变0继续找。
#include<cstring> #include<algorithm> #include<vector> #include<map> #include<queue> #include<cstdio> #include<cmath> #define ll long long #define lowbit(x) x&(-x) using namespace std; const int N=2e5+10; ll a[N],c[N],n,m,v[N],b[N]; ll ask(ll x) { ll ans=0; for(;x;x-=lowbit(x)) ans+=c[x]; return ans; } void add(ll x,ll y) { for(;x<=n;x+=lowbit(x)) { c[x]+=y; // printf("x:%lld\n",x); } } int main() { scanf("%lld",&n); a[1]++; for(int i=2;i<=n;i++) { scanf("%lld",&a[i]); a[i]=a[i]+1; add(i,1); } add(1,1); for(int i=n;i>=1;i--) { ll l=1,r=n+1; while(r-l>=1) { ll mid=l+r>>1; if(ask(mid)>=a[i]) r=mid; else l=mid+1; } b[i]=l; add(l,-1); } for(int i=1;i<=n;i++) { printf("%lld\n",b[i]); } }