• 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;
    }
    


  • 相关阅读:
    竞赛题解
    学习笔记
    竞赛题解
    学习笔记
    竞赛题解
    竞赛题解
    竞赛题解
    「链接」原博客链接
    「杂录」THUWC 2020 游记
    「杂录」CSP-S 2019 爆炸记&题解
  • 原文地址:https://www.cnblogs.com/clnchanpin/p/7228144.html
Copyright © 2020-2023  润新知