树状数组+二分
poj2182 AC hdu2711 WA 有时间在研究吧
#include <cstdio>
#include <cstring>
using namespace std;
#define maxn 8005
int arr[maxn],a[maxn],s[maxn];
int lowbit(int x)
{
return x&(-x);
}
void update(int x,int n)
{
while(x<=n)
{
arr[x]++;
x+=lowbit(x);
}
}
int getsum(int x)
{
int ans=0;
while(x>0)
{
ans+=arr[x];
x-=lowbit(x);
}
return ans;
}
int search(int x,int n)
{
int left=1,right=n,mid,temp;
while(left<right)
{
mid=(left+right)/2;
temp=mid-getsum(mid);
if(temp<x)
left=mid+1;
else
right=mid;
}
return left;
}
int main()
{
int n,i,j,k;
while(scanf("%d",&n)!=EOF)
{
for(i=2;i<=n;i++) scanf("%d",&a[i]);
for(i=n;i>=1;i--)
{
k=search(a[i]+1,n);
update(k,n);
s[i]=k;
}
for(i=1;i<=n;i++) printf("%d\n",s[i]);
}
return 0;
}
大神插空 都AC
#include <cstdio>
using namespace std;
#define maxn 8005
int cow[maxn],d[maxn];
int main()
{
int i,head,t,n,num,current,m;
while(scanf("%d",&n)!=EOF)
{
head=1;
cow[head]=0;
for(i=2;i<=n;i++)
{
scanf("%d",&num);
if(num)
{
current=head;
while(--num) current=cow[current];
t=cow[current];
cow[current]=i;
cow[i]=t;
}
else
{
cow[i]=head;
head=i;
}
}
m=0;
for(i=head;i;i=cow[i]) d[i]=++m;
for(i=1;i<=n;i++)
printf("%d\n",d[i]);
}
return 0;
}
算法