题目大意:
给出的东西要求建立一个堆,使得后面的数字满足堆的性质。并且字符串满足搜索序
思路分析:
用线段树的最大询问建树。在建树之前先排序,然后用中序遍历递归输出。
注意输入的时候的技巧。
。。
#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; }