首页 > 代码库 > POJ 1785 Binary Search Heap Construction (线段树)

POJ 1785 Binary Search Heap Construction (线段树)

题目大意:

给出的东西要求建立一个堆,使得后面的数字满足堆的性质。并且字符串满足搜索序


思路分析:

用线段树的最大询问建树。在建树之前先排序,然后用中序遍历递归输出。

注意输入的时候的技巧。

。。


#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
#define lson num<<1,s,mid
#define rson num<<1|1,mid+1,e
#define maxn 55555

using namespace std;

struct node
{
    int data;
    char str[50];
    bool operator < (const node &cmp)const
    {
        //return data<cmp.data;
        return strcmp(str,cmp.str)<0;
    }
}save[maxn];
int res[maxn<<2];
int pos[maxn<<2];
int n;

void pushup(int num)
{
    res[num]=max(res[num<<1],res[num<<1|1]);
    if(res[num<<1]>res[num<<1|1])pos[num]=pos[num<<1];
    else pos[num]=pos[num<<1|1];
}
void build(int num,int s,int e)
{
    if(s==e)
    {
        res[num]=save[s].data;
        pos[num]=s;
        return;
    }
    int mid=(s+e)>>1;
    build(lson);
    build(rson);
    pushup(num);
}
int query(int num,int s,int e,int l,int r)
{
    if(l<=s && r>=e)
    {
        return pos[num];
    }
    int mid=(s+e)>>1;
    if(r<=mid)return query(lson,l,r);
    else if(l>mid)return query(rson,l,r);
    else
    {
        int lmost=query(lson,l,mid);
        int rmost=query(rson,mid+1,r);
        if(save[lmost].data<=save[rmost].data)return rmost;
        else return lmost;
    }
}
void print(int l,int r)
{
    if(l>r)return;
    if(l==r)
    {
        printf("(%s/%d)",save[l].str,save[l].data);
        return;
    }
    int mid=query(1,1,n,l,r);
    printf("(");
    print(l,mid-1);
    printf("%s/%d",save[mid].str,save[mid].data);
    print(mid+1,r);
    printf(")");
}
int main()
{
    while(scanf("%d",&n)!=EOF && n)
    {
        for(int i=1;i<=n;i++)
        {
            scanf(" %[a-z]/%d",save[i].str,&save[i].data);
           // printf("%s%d",save[i].str,save[i].data);
        }
        sort(save+1,save+1+n);
        build(1,1,n);
        print(1,n);
        puts("");
    }
    return 0;
}


POJ 1785 Binary Search Heap Construction (线段树)