poj 3438:Balanced Lineup

来源:互联网 发布:淘宝卖家免费装修模板 编辑:程序博客网 时间:2024/05/20 13:37

解题思路:

(1)线段树

(2)注意“父”到“子”的划分

(3)慎重调用库函数

(4)scanf的必要性

#include<iostream>#include<stdio.h>using namespace std;const int inf = 1<<30;int N,Q;int H[50010];struct node{int nMax,nMin;int starts,ends;node * left;node * right;};void buildTree(int i,int j,node * t){t->left = NULL;t->right = NULL;if(i==j){t->nMax = H[i];t->nMin = H[j];t->left = NULL;t->right = NULL; }else{node * l = new node;node * r = new node;t->left = l;t->right = r;buildTree(i,(i+j)/2,l);buildTree((i+j)/2+1,j,r);t->nMax = max(t->left->nMax,t->right->nMax);t->nMin = min(t->left->nMin,t->right->nMin);}t->starts = i;t->ends = j;return;}int maxAns,minAns;void query(int p,int q,node * t){if(t == NULL)return;if(t->starts==p && t->ends==q){if(t->nMax>maxAns)maxAns = t->nMax;if(t->nMin<minAns)minAns = t->nMin;return;}int mid = (t->starts + t->ends)/2;if(q<=mid)query(p,q,t->left);if(p>mid)query(p,q,t->right);if(q>mid && p<=mid){query(p,mid,t->left);query(mid+1,q,t->right);}return;} int main(){scanf("%d%d",&N,&Q);for(int i=1;i<=N;i++)scanf("%d",&H[i]);//建树 node * root = new node;buildTree(1,N,root);//查询 int p,q;for(int i=1;i<=Q;i++){maxAns = -inf;minAns = inf;scanf("%d%d",&p,&q);query(p,q,root);printf("%d\n",maxAns-minAns);}return 0;} 


0 0
原创粉丝点击