线段树区间查询,3000+ms水过
#include <cstdio>
#include <cstring>
const int MAXN = 50010;
int N,Q;
int num[MAXN];
int maxn,minn;
struct node
{
int maxn;
int minn;
int l,r;
};
node segTree[MAXN<<2];
int max(int a, int b)
{
return a > b ? a : b;
}
int min(int a, int b)
{
return a > b ? b : a;
}
void buildTree(int t, int l, int r)
{
segTree[t].l = l;
segTree[t].r = r;
if(l == r)
{
segTree[t].minn = segTree[t].maxn = num[l];
return;
}
int mid = (l+r) >> 1;
buildTree(t<<1,l,mid);
buildTree(t<<1|1,mid+1,r);
segTree[t].maxn = max(segTree[t<<1].maxn,segTree[t<<1|1].maxn);
segTree[t].minn = min(segTree[t<<1].minn,segTree[t<<1|1].minn);
}
void query(int t,int l, int r)
{
if(l == segTree[t].l && r == segTree[t].r)
{
maxn = max(maxn,segTree[t].maxn);
minn = min(minn,segTree[t].minn);
return;
}
int mid = (segTree[t].l + segTree[t].r) >>1;
if(r <= mid)
query(t<<1,l,r);
else if(l > mid)
query(t<<1|1,l,r);
else
{
query(t<<1,l,mid);
query(t<<1|1,mid+1,r);
}
}
int main()
{
int a,b;
while(scanf("%d %d",&N,&Q) != EOF)
{
for(int i = 1; i <= N; ++i)
scanf("%d",&num[i]);
buildTree(1,1,N);
for(int i = 0; i < Q; ++i)
{
maxn = 0;
minn = 1000010;
scanf("%d %d",&a,&b);
query(1,a,b);
printf("%d\n",maxn-minn);
}
}
return 0;
}
ST算法,要比线段树快了大概一倍
#include <stdio.h>
#include <math.h>
const int MAX = 50010;
int maxn[MAX][20];
int minn[MAX][20];
int num[MAX];
int n,q;
int max(int a, int b)
{
return a > b ? a : b;
}
int min(int a, int b)
{
return a > b ? b : a;
}
void init()
{
int limit = log(n*1.0)/log(2.0)+1;
for(int j = 1; j < limit; ++j)
{
for(int i = 1; i <= n; ++i)
{
if(i+(1<<j)-1 <= n)
{
maxn[i][j] = max(maxn[i][j-1],maxn[i+(1<<(j-1))][j-1]);
minn[i][j] = min(minn[i][j-1],minn[i+(1<<(j-1))][j-1]);
}
}
}
}
int rmq(int a, int b)
{
int k = log(b-a+1.0)/log(2.0);
int maxnum = max(maxn[a][k],maxn[b-(1<<k)+1][k]);
int minnum = min(minn[a][k],minn[b-(1<<k)+1][k]);
return maxnum - minnum;
}
int main()
{
scanf("%d %d",&n,&q);
for(int i = 1; i <= n; ++i)
{
scanf("%d",&maxn[i][0]);
minn[i][0] = maxn[i][0];
}
init();
int a,b;
while(q--)
{
scanf("%d %d",&a,&b);
printf("%d\n",rmq(a,b));
}
return 0;
}