首页 > 代码库 > 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; }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。