POJ-2182-Lost Cows
阿新 • • 發佈:2018-12-31
這個題是給你一列數,每個數代表當前數在數列中存在比自己小的個數(從第二個開始),然後要求你求出該數在原序列中的位置
用線段樹做,每次查詢當前區間第k個數,因為從後面向前掃描,可以確定每個數在原來數列中的位置,需要做的工作緊緊是找出這個數
程式碼:
#include<cstdio> #include<cstring> #include<iostream> using namespace std; const int maxn=8001; struct node { int l; int r; int val; }t[maxn*3]; int a[maxn],ans[maxn],cur; void Build(int l,int r,int index) { t[index].l=l; t[index].r=r; t[index].val=r-l+1; if(l==r) return; int mid=(l+r)>>1; Build(l,mid,index<<1); Build(mid+1,r,index<<1|1); } int Query(int index,int num) { t[index].val--; if(t[index].l==t[index].r) return t[index].l; if(t[index<<1].val>=num) return Query(index<<1,num); else return Query(index<<1|1,num-t[index<<1].val); } int main() { int n; while(scanf("%d",&n)!=EOF) { cur=0; Build(1,n,1); a[1]=0; for(int i=2;i<=n;i++) scanf("%d",&a[i]); for(int i=n;i>=1;i--) ans[i]=Query(1,a[i]+1); for(int i=1;i<=n;i++) printf("%d\n",ans[i]); } return 0; }