题目链接:http://poj.org/problem?id=3264
题目大意:就是给你一串数,问你最大数和最小数的差值。。。。。。。
思路:最基本的线段树,只需要建树和查询,修改都省啦,但是查询要写两个,一个查询最大值,一个查询最小值。。。。。。然后就能AC掉。。。。。但是话说poj把它分类到RMQ中。。。。
code:
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<iostream>
#define Max 50010
using namespace std;
struct Node
{
int l,r;
int minn,maxx;
}node[Max*4];
int num[Max];
void BuildTree(int i,int l,int r)
{
node[i].l=l;
node[i].r=r;
if(l==r)
{
node[i].maxx=node[i].minn=num[l];
return ;
}
int mid=(l+r)/2;
BuildTree(i*2,l,mid);
BuildTree(i*2+1,mid+1,r);
node[i].maxx=max(node[i*2].maxx,node[i*2+1].maxx);
node[i].minn=min(node[i*2].minn,node[i*2+1].minn);
}
int Query(int i,int l,int r) //查询最大值
{
if(node[i].l==l&&node[i].r==r)
{
return node[i].maxx;
}
int mid=(node[i].l+node[i].r)/2;
if(r<=mid) return Query(i*2,l,r);
else if(l>mid) return Query(i*2+1,l,r);
else
{
return max(Query(i*2,l,mid),Query(i*2+1,mid+1,r));
}
}
int Query1(int i,int l,int r) //查询最小值
{
if(node[i].l==l&&node[i].r==r)
{
return node[i].minn;
}
int mid=(node[i].l+node[i].r)/2;
if(r<=mid) return Query1(i*2,l,r);
else if(l>mid) return Query1(i*2+1,l,r);
else
{
return (min(Query1(i*2,l,mid),Query1(i*2+1,mid+1,r)));
}
}
int main()
{
int n,q;
while(scanf("%d%d",&n,&q)==2)
{
int i;
for(i=1;i<=n;i++)
{
scanf("%d",&num[i]);
}
BuildTree(1,1,n);
for(i=1;i<=q;i++)
{
int a,b;
scanf("%d%d",&a,&b);
int m1=Query(1,a,b);
int m2=Query1(1,a,b);
printf("%d\n",m1-m2);
}
}
return 0;
}
poj 3264 Balanced Lineup,布布扣,bubuko.com
原文地址:http://blog.csdn.net/u010304217/article/details/38276321