POJ 2182 Lost Cows

趁熱來一發線段樹,主要是聯繫一下線段樹的基本操作,寫了兩道題之後確實感覺手感好了很多,這道題的思路是,從後向前挨個數,最後一個牛總是可以判斷是第幾個,然後就把相應的位置佔住,以後再數的時候就不能數已經佔住的位置了,說的不是很清楚,但是代碼的思路比較清晰:

#include <iostream>
#include <cstdio>
#include <memory.h>
using namespace std;

#define maxn 8050

struct node{
    int left;
    int right;
    int len;
};

node tree[maxn<<2]={0};
int cows[maxn]={0};
int ans[maxn]={0};

void build(int left, int right, int loc){
    tree[loc].left = left;
    tree[loc].right = right;
    tree[loc].len = right - left + 1;
    if(left == right)
        return;
    int mid = (right + left)>>1;
    build(left,mid,loc<<1);
    build(mid+1,right,(loc<<1)+1);
}

int query(int num,int loc){
    tree[loc].len -- ;
    if(tree[loc].left == tree[loc].right){
        return tree[loc].left;
    }
    if(tree[loc<<1].len < num){
        return query(num-tree[loc<<1].len,(loc<<1)+1);
    }
    else{
        return query(num,loc<<1);
    }
}

int main(){
    int n;
    scanf("%d",&n);
    for(int i=2;i<=n;++i){
        scanf("%d",&cows[i]);
    }
    build(1,n,1);

    for(int i=n;i>0;--i){
        ans[i] = query(cows[i]+1,1);
    }
    for(int i=1;i<=n;++i){
        printf("%d\n",ans[i]);
    }
    //system("pause");
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章