poj 3264(线段树)

时间:2023-03-09 01:14:44
poj 3264(线段树)

http://poj.org/problem?id=3264

初学线段可以做的水题,也是线段树的基础运用。也是我的第一个线段树的题。

题意:在区间范围内的最大值减去最小值

思路:线段树记录下每个区间内的最大值以及最小值,然后查询。

我也是第一次做,然后耗时比较多。

 #include <stdio.h>
#include <string.h>
#define maxn 500500 int max(int x,int y)
{
return x > y? x : y ;
}
int min(int x,int y)
{
return x > y? y : x;
} struct note{ int Min,Max; }segtree[ maxn * ]; int arra[ maxn ]; void build(int root , int arr[] , int instart , int iend)
{
if(instart == iend)
{
// segtree[ root ].val = arr[ instart ];
segtree[ root ].Max = arr[ instart ];
segtree[ root ].Min = arr[ instart ];
}
else
{
int mid = (instart+iend)/;
build( root * , arr , instart , mid );
build( root * + , arr , mid + , iend );
segtree[ root ].Max = max(segtree[ root * ].Max,segtree[ root * + ].Max);
segtree[ root ].Min = min(segtree[ root * ].Min,segtree[ root * + ].Min);
}
} int remin(int root ,int nstart , int nend , int qstart , int qend)
{
if(qstart > nend || qend < nstart)
return maxn*;
if( qstart <= nstart && qend >= nend )
return segtree[ root ].Min;
int mid =( nstart + nend ) / ;
return min(remin(root * ,nstart,mid,qstart,qend),
remin(root * + , mid + , nend , qstart , qend ));
}
int reMax(int root , int nstart , int nend , int qstart , int qend)
{
if(qstart > nend || qend < nstart)
return ;
if(qstart <= nstart && qend >= nend )
return segtree [ root ].Max;
int mid = ( nstart + nend ) / ;
return max(reMax(root * , nstart , mid , qstart , qend ),
reMax(root * + , mid + , nend , qstart , qend ) );
} int main()
{
// freopen("in.txt","r",stdin);
int m,n,a,b,ma,mi;
scanf("%d%d",&m,&n);
for( int i = ; i <= m ; i++ )
scanf("%d",&arra[ i ]);
build(,arra,,m);
while(n--)
{
scanf("%d%d",&a,&b);
ma = reMax(,,m,a,b);
mi = remin(,,m,a,b);
printf("%d\n",ma-mi);
}
return ;
}