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并且任意节点的string和r都是唯一的。最后按要求输出该Treap即可。
分析:
直接构建Treap即可,不过树中的节点v值要改为string类型了。本来想用Treap做的,结果一直超时。
现在用RMQ重新做过。由于每个节点两种属性v值和优先级r,先读入所有的节点信息,然后将所有节点按第一关键字排序。然后我们递归处理[1,n]区间内的信息,用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
- POJ 1785 Binary Search Heap Construction(RMQ)
- poj 1785 Binary Search Heap Construction( 分治 + RMQ )
- POJ 1785 Binary Search Heap Construction
- POJ 1785 Binary Search Heap Construction [treap]
- POJ 1785 : Binary Search Heap Construction
- POJ 1785 Binary Search Heap Construction 笔记
- POJ 1785 Binary Search Heap Construction 【笛卡尔树构造,线段树RMQ(Range Max/Min Query)】
- poj 1785 Binary Search Heap Construction(笛卡尔树)
- SDUT 1232 / POJ 1785 Binary Search Heap Construction
- POJ 1785 Binary Search Heap Construction (线段树)
- POJ-1785-Binary Search Heap Construction(笛卡尔树)
- poj-1785 Binary Search Heap Construction(笛卡尔树)
- 笛卡尔树 POJ ——1785 Binary Search Heap Construction
- POJ 1785 Binary Search Heap Construction 笛卡尔树
- POJ 1875 Binary Search Heap Construction
- POJ 1875 Binary Search Heap Construction(treap)
- ZOJ 2243 & POJ 1785 Binary Search Heap Construction 笛卡尔树 || 单调栈
- POJ1785 Binary Search Heap Construction【笛卡尔树】
- jzsdygfkljsdghos83tysiudfghkudfjhgkjdfgdfg
- Linux编译安装Darwin Streaming Server 6.0.3
- 【C语言】06-基本数据类型
- vmalloc
- SQL Server 2012新特性(1)T-SQL操作FileTable目录实例
- POJ 1785 Binary Search Heap Construction(RMQ)
- 作为一个状态机的OpenGL
- httpclient4 中文版帮助文档,最新官方版翻译版(第一章 下)
- Volley String cannot be converted to JSONObject BOM
- VC2013终于也认为无参数的函数加个void是没有必要的了
- php中的PDO操作
- exists改写成left join
- 单尺度上Harris-SIFT特征提取匹配
- PHP图像函数