http://acm.hdu.edu.cn/showproblem.php?pid=2711
(1)又是一道从后往前更新的题目,该算法确实经典。
(2)新亮点:用到了变量pos求ans[i];另外,用search()函数单独处理ans[1]。
具体代码:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
![](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
#include<stdio.h> #define lson l, m, rt<<1 #define rson m+1, r, rt<<1|1 const int maxn=81000; int n; int data[maxn], sum[maxn<<2]; int ans[maxn]; void pushup(int rt) { sum[rt]=sum[rt<<1]+sum[rt<<1|1]; } void build(int l, int r, int rt) { sum[rt]=r-l+1; if(l==r) return ; int m=l+r>>1; build(lson); build(rson); } void update(int p, int pos, int l, int r, int rt) { if(l==r) { sum[rt]=0; ans[pos]=l; return ; } int m=l+r>>1; if(p<=sum[rt<<1]) update(p, pos, lson); else update(p-sum[rt<<1], pos, rson); pushup(rt); } void search(int l, int r, int rt) { if(l==r) { ans[1]=l; return ; } int m=l+r>>1; if(sum[rt<<1]) search(lson); else search(rson); } int main() { while(scanf("%d", &n)!=EOF) { build(1, n, 1); for(int i=2;i<=n;i++) scanf("%d", &data[i]); for(int i=n;i>=2;i--) { update(data[i]+1, i, 1, n, 1); } search(1, n, 1); for(int i=1;i<=n;i++) printf("%d\n", ans[i]); } return 0; }