[HDU] 5444.Elven Postman (堆)

题意:对于一个堆,找出从根节点出发到某一个点的行走的路径

输入:第一行数据组数T,每一组第1行元素个数n,第2行各个元素,第3行询问个数,第4行询问元素。

输出:每一询问元素打印出由"E","W”组成的字符串,若所查询节点就是根节点,则输出一个空行

For instance, the sequence 2, 1, 4, 3 would be written on the root of the following tree.

 

Sample Input
2
4
2 1 4 3
3
1 2 3
6
6 5 4 3 2 1
1
1
 
Sample Output
E
 
 
WE
EEEEE
 
就是一道暴力模拟堆的题目,需要注意的是处理每组数据都要重置树的各个节点,还有插入时的一些细节。
这里我用的是数组进行模拟,下面就是代码。
#include <iostream>
#include <cstdio>

using namespace std;
const int MAXN=1010;
struct pt
{
    int l,r;
    pt(int l=-1,int r=-1):l(l),r(r){}

}p[MAXN];

int qr[MAXN];
int rt;
void ph(int k)
{
    int t=rt;
    while(t!=-1)
    {
        if(p[t].l==-1&&t>k)
        {
            p[t].l=k;
            break;
        }
        if(p[t].r==-1&&t<k)
        {
            p[t].r=k;
            break;
        }
        t = k<t? p[t].l:p[t].r;
    }
}

void find(int k)
{
    int t=rt;
    while(k!=t)
    {
        if(k>t)    printf("W"),t=p[t].r;
        else if(k<t) printf("E"),t=p[t].l;
    }
    printf("\n");
}


int main()
{
    int t,q;
    cin>>t;
    while(t--)
    {
        for(int i=1;i<MAXN;++i)  //重置节点
            p[i].l=p[i].r=-1;
        int n,k;
        cin>>n;
        for(int i=1;i<=n;++i)
        {
            scanf("%d",&k);
            if(i==1)    rt=k;
            ph(k);
        }
        cin>>q;
        for(int i=1;i<=q;++i)
            scanf("%d",&qr[i]);
        for(int i=1;i<=q;++i)
            find(qr[i]);
    }
    return 0;
}

 

posted @ 2019-07-25 21:35  JNzH  阅读(180)  评论(0编辑  收藏  举报