题目连接:http://poj.org/problem?id=3264
题意:给定Q(1<=Q<=200000)个数A1,A2,```,AQ,多次求任一区间Ai-Aj中最大数和最小数的差。
线段树功能:区间求最值,O(logN)复杂度查询
#pragma comment(linker,"/STACK:102400000,102400000") #include <cstdio> #include <cstring> #include <string> #include <cmath> #include <iostream> #include <algorithm> #include <queue> #include <cstdlib> #include <stack> #include <vector> #include <set> #include <map> #define LL long long #define mod 1000000007 #define inf 0x3f3f3f3f #define N 50010 #define FILL(a,b) (memset(a,b,sizeof(a))) #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 using namespace std; int mx[N<<2],mn[N<<2]; void Pushup(int rt) { mn[rt]=min(mn[rt<<1],mn[rt<<1|1]); mx[rt]=max(mx[rt<<1],mx[rt<<1|1]); } void build(int l,int r,int rt) { if(l==r) { int x; scanf("%d",&x); mn[rt]=mx[rt]=x; return; } int m=(l+r)>>1; build(lson); build(rson); Pushup(rt); } int querymin(int L,int R,int l,int r,int rt) { if(L<=l&&r<=R) { return mn[rt]; } int m=(l+r)>>1; int res=inf; if(L<=m)res=min(res,querymin(L,R,lson)); if(m<R)res=min(res,querymin(L,R,rson)); return res; } int querymax(int L,int R,int l,int r,int rt) { if(L<=l&&r<=R) { return mx[rt]; } int m=(l+r)>>1; int res=0; if(L<=m)res=max(res,querymax(L,R,lson)); if(m<R)res=max(res,querymax(L,R,rson)); return res; } int main() { int n,m; int a,b; while(scanf("%d%d",&n,&m)>0) { build(1,n,1); while(m--) { scanf("%d%d",&a,&b); int tallest=querymax(a,b,1,n,1); int shortest=querymin(a,b,1,n,1); printf("%d\n",tallest-shortest); } } }
时间: 2024-10-30 15:33:04