Language: Default Balanced Lineup
Description For the daily milking, Farmer John‘s N cows (1 ≤ N ≤ 50,000) always line up in the same order. One day Farmer John decides to organize a game of Ultimate Frisbee with some of the cows. To keep things simple, he will take a contiguous range Farmer John has made a list of Q (1 ≤ Q ≤ 200,000) potential groups of cows and their heights (1 ≤ height ≤ 1,000,000). For each group, he wants your help to determine the difference in height between the shortest and the tallest Input Line 1: Two space-separated integers, N and Q. Lines 2..N+1: Line i+1 contains a single integer that is the height of cow i Lines N+2..N+Q+1: Two integers A and B (1 ≤ A ≤ B ≤ N), representing the range of cows from A to B inclusive. Output Lines 1..Q: Each line contains a single integer that is a response to a reply and indicates the difference in height between the tallest and shortest cow in the range. Sample Input 6 3 1 7 3 4 2 5 1 5 4 6 2 2 Sample Output 6 3 0 Source |
求区间最大减最小
线段树代码:
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<cmath> #include<queue> #include<stack> #include<vector> #include<set> #include<map> #define L(x) (x<<1) #define R(x) (x<<1|1) #define MID(x,y) ((x+y)>>1) #define eps 1e-8 typedef __int64 ll; using namespace std; #define N 50005 int n,m,a[N]; struct stud{ int le,ri; int mi,ma; }f[N*4]; void build(int pos,int le,int ri) { f[pos].le=le; f[pos].ri=ri; if(le==ri) { f[pos].mi=f[pos].ma=a[le]; return ; } int mid=MID(le,ri); build(L(pos),le,mid); build(R(pos),mid+1,ri); f[pos].ma=max(f[L(pos)].ma,f[R(pos)].ma); f[pos].mi=min(f[L(pos)].mi,f[R(pos)].mi); } int querymin(int pos,int le,int ri) { if(f[pos].le>=le&&f[pos].ri<=ri) return f[pos].mi; int mid=MID(f[pos].le,f[pos].ri); if(mid>=ri) return querymin(L(pos),le,ri); if(mid<le) return querymin(R(pos),le,ri); return min(querymin(L(pos),le,mid),querymin(R(pos),mid+1,ri)); } int querymax(int pos,int le,int ri) { if(f[pos].le>=le&&f[pos].ri<=ri) return f[pos].ma; int mid=MID(f[pos].le,f[pos].ri); if(mid>=ri) return querymax(L(pos),le,ri); if(mid<le) return querymax(R(pos),le,ri); return max(querymax(L(pos),le,mid),querymax(R(pos),mid+1,ri)); } int main() { #ifndef ONLINE_JUDGE freopen("in.txt","r",stdin); #endif // ONLINE_JUDGE int i,j; while(~scanf("%d%d",&n,&m)) { for(i=1;i<=n;i++) scanf("%d",&a[i]); build(1,1,n); int le,ri; while(m--) { scanf("%d%d",&le,&ri); printf("%d\n",querymax(1,le,ri)-querymin(1,le,ri)); } } return 0; }
RMQ 代码:
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<cmath> #include<queue> #include<stack> #include<vector> #include<set> #include<map> #define L(x) (x<<1) #define R(x) (x<<1|1) #define MID(x,y) ((x+y)>>1) #define eps 1e-8 typedef __int64 ll; using namespace std; #define N 50005 int dpmin[N][20]; int dpmax[N][20]; int n,m,a[N]; void inint() { int i,j; for(i=1;i<=n;i++) dpmin[i][0]=dpmax[i][0]=a[i]; for(j=1;(1<<j)<=n+1;j++) for(i=1;i+(1<<j)-1<=n;i++) { dpmin[i][j]=min(dpmin[i][j-1],dpmin[i+(1<<(j-1))][j-1]); dpmax[i][j]=max(dpmax[i][j-1],dpmax[i+(1<<(j-1))][j-1]); } } inline int getmax(int le,int ri) { int k=(int)(log(ri-le+1+0.0)/log(2.0)); return max(dpmax[le][k],dpmax[ri-(1<<k)+1][k]); } inline int getmin(int le,int ri) { int k=(int)(log(ri-le+1+0.0)/log(2.0)); return min(dpmin[le][k],dpmin[ri-(1<<k)+1][k]); } int main() { // #ifndef ONLINE_JUDGE // freopen("in.txt","r",stdin); // #endif // ONLINE_JUDGE int i,j; while(~scanf("%d%d",&n,&m)) { for(i=1;i<=n;i++) scanf("%d",&a[i]); inint(); int le,ri; while(m--) { scanf("%d%d",&le,&ri); printf("%d\n",getmax(le,ri)-getmin(le,ri)); } } return 0; }