POJ2182 Lost Cows(線段樹)

線段樹找第K大數,每一個結點記錄下面尚未找過的數的數目len,當查找第K大數的時候,看它左子樹的len值是否大於K,若是大於說明左子樹可以容納K個數,不然在它的右子樹上找K-左子樹的len大數。
#include<stdio.h> struct node {         int l,r;         int len; }tree[4*8080]; int d1[8080]; int ans[8080]; void build_tree(int p,int a,int b) {         tree[p].l=a;         tree[p].r=b;         tree[p].len=b-a+1;         if (a==b)         {                 return;         }         else         {                 int w=p<<1;                 int mid=(a+b)>>1;                 build_tree(w,a,mid);                 build_tree(w+1,mid+1,b);         } } int qurey(int p,int k) {         tree[p].len--;         if (tree[p].l==tree[p].r)                 return tree[p].l;         int w=p<<1;         if (tree[w].len>=k)         {                 return qurey(w,k);         }         else         {                 return qurey(w+1,k-tree[w].len);         } } int main() {         int n;         int i;         scanf("%d",&n);         build_tree(1,1,n);         for (i=1;i<n;i++)         {                 scanf("%d",d1+i);                 d1[i]++;         }         d1[0]=1;         for (i=n-1;i>=0;i--)         {                 ans[i]=qurey(1,d1[i]);         }         for (i=0;i<n;i++)         {                 printf("%d\n",ans[i]);         }         return 0; }
相關文章
相關標籤/搜索