poj(3264+线段树)

来源:互联网 发布:abc优化算法流程图 编辑:程序博客网 时间:2024/04/29 12:30

    题目链接:http://poj.org/problem?id=3264

    有n个数字,编号1...N,做K次查询,每次查询输出编号A...B之间最大的一个和最小的一个的差值。

 代码:

#include<stdio.h>#define MAXN 50005struct Node{int left;int right;int max;int min;}node[MAXN * 4];int hei[MAXN];int N,Q;int ansmax,ansmin;int Max(int a,int b){return a>b ? a : b ;}int Min(int a,int b){return a<b ? a : b ;}void BuildTree(int left,int right,int tot){ node[tot].left = left;node[tot].right = right;if(left == right){node[tot].max = node[tot].min = hei[left];return ;} BuildTree(left,(left+right)/2,tot*2);BuildTree((left+right)/2+1,right,tot*2+1);node[tot].max = Max(node[tot*2].max,node[tot*2+1].max);node[tot].min = Min(node[tot*2].min,node[tot*2+1].min);}void Query(int left,int right,int tot){if(node[tot].left == left &&  node[tot].right == right){ansmax = Max(ansmax,node[tot].max);ansmin = Min(ansmin,node[tot].min);return ;}    if(left <= node[tot*2].right){int r = Min(right,node[tot*2].right);Query(left,r,tot*2);}if(right >= node[tot*2+1].left){int l = Max(left,node[tot*2+1].left);Query(l,right,tot*2+1);}}int main(){   while(scanf("%d%d",&N,&Q)!=EOF)   {   int i,s,t;   for(i=1;i<=N;i++)   {           scanf("%d",&hei[i]);   }   BuildTree(1,N,1);   while(Q--)   {      scanf("%d%d",&s,&t);   ansmax = 0;   ansmin = 1000000;   Query(s,t,1);   printf("%d\n",ansmax-ansmin);   }   }   return 0;}


 

 

原创粉丝点击