POJ 1785 Binary Search Heap Construction(RMQ)

来源:互联网 发布:pl sql developer 12 编辑:程序博客网 时间:2024/05/18 05:01

POJ 1785 Binary Search Heap Construction(RMQ)

http://poj.org/problem?id=1785

题意:

        给你每个节点的两个信息:string值和r优先级。要求你构建一个Treap并且任意节点的stringr都是唯一的。最后按要求输出该Treap即可。

分析:

        直接构建Treap即可,不过树中的节点v值要改为string类型了。本来想用Treap做的,结果一直超时。

          现在用RMQ重新做过。由于每个节点两种属性v值和优先级r,先读入所有的节点信息,然后将所有节点按第一关键字排序。然后我们递归处理[1n]区间内的信息,用RMQ先找出[1,n]内的最大r值的节点mid,并输出信息,然后递归处理左边的区间[1,mid-1]和右边的区间[mid+1,n]即可.

AC代码:

#include<cstdio>#include<cstring>#include<algorithm>using namespace std;const int maxn=55555;int dmax[maxn][20];int mm[maxn];int n;struct node{    char v[150];    int r;    bool operator<(const node&b)const    {        return strcmp(v,b.v)<0;    }}nodes[maxn];int maxv(int i,int j){    if(nodes[i].r>nodes[j].r) return i;    return j;}void initMax(){    mm[0]=-1;    for(int i=1;i<=n;i++)    {        dmax[i][0]=i;        mm[i] = (i&(i-1))==0 ?mm[i-1]+1:mm[i-1];    }    for(int j=1;j<=mm[n];j++)        for(int i=1;i+(1<<j)-1<=n;i++)            dmax[i][j]=maxv(dmax[i][j-1],dmax[i+(1<<(j-1))][j-1]);}int getMax(int L,int R){    int k=mm[R-L+1];    return maxv(dmax[L][k],dmax[R-(1<<k)+1][k]);}void solve(int l,int r){    if(l<=r)    {        int mid=getMax(l,r);        printf("(");        solve(l,mid-1);        printf("%s/%d",nodes[mid].v,nodes[mid].r);        solve(mid+1,r);        printf(")");    }}int main(){    while(scanf("%d",&n)==1&&n)    {        for(int i=1;i<=n;i++)        {            scanf("%s",nodes[i].v);            int j;            for(j=0;nodes[i].v[j]!='/';j++);            nodes[i].r=nodes[i].v[j]=0;            for(j++;nodes[i].v[j]!=0;j++)                nodes[i].r = nodes[i].r*10+nodes[i].v[j]-'0';        }        sort(nodes+1,nodes+n+1);        initMax();        solve(1,n);        printf("\n");    }    return 0;}


 

0 0