题目链接: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