一个线段树的水题。
用RMQ水了一个。
时间比线段树快乐将近0.5s,但空间大了很多
线段树代码如下:
/* Memroy 2740K Time 4016Ms */ #include<iostream> #include<cstdio> using namespace std; #define maxn 50005 #define lson rt<<1 #define rson rt<<1|1 struct Tree { int l,r; int mx,mn; }tree[maxn<<2]; void PushUp(int rt) { tree[rt].mx=max(tree[lson].mx,tree[rson].mx); tree[rt].mn=min(tree[lson].mn,tree[rson].mn); } void build(int l,int r, int rt) { tree[rt].l=l; tree[rt].r=r; if(l==r){ scanf("%d",&tree[rt].mx); tree[rt].mn=tree[rt].mx; return ; } int m=(l+r)>>1; build(l,m,lson); build(m+1,r,rson); PushUp(rt); } int query_mx(int x,int y,int rt) { int l,r; l=tree[rt].l; r=tree[rt].r; if(l==x&&r==y){ return tree[rt].mx; } int m=(l+r)>>1,ans=0; if(x<=m) ans=max(ans,query_mx(x,min(m,y),lson)); if(y>m) ans=max(ans,query_mx(max(m+1,x),y,rson)); return ans; } int query_mn(int x,int y,int rt) { int l,r; l=tree[rt].l; r=tree[rt].r; if(l==x&&r==y){ return tree[rt].mn; } int m=(l+r)>>1,ans= 1000000; if(x<=m) ans=min(ans,query_mn(x,min(m,y),lson)); if(y>m) ans=min(ans,query_mn(max(m+1,x),y,rson)); return ans; } int main() { int m,n,a,b; while(~scanf("%d%d",&n,&m)){ build(1,n,1); while(m--){ scanf("%d%d",&a,&b); printf("%d\n",query_mx(a,b,1)-query_mn(a,b,1)); } } return 0; }
RMQ的代码如下:
/* Memory 16560K Time 3563ms */ #include<iostream> #include<cstdio> #include<cmath> using namespace std; #define maxn 50005 int dp1[maxn][40]; int dp2[maxn][40]; int a[maxn],n,m; void RMQ_init1() { for(int i=1;i<=n;i++) dp1[i][0]=a[i]; for(int j=1;j<=log((double)n)/log(2.0);j++) for(int i=1;i+(1<<j)-1<=n;i++) dp1[i][j]=min(dp1[i][j-1],dp1[i+(1<<(j-1))][j-1]); } void RMQ_init2() { for(int i=1;i<=n;i++) dp2[i][0]=a[i]; for(int j=1;j<=log((double)n)/log(2.0);j++) for(int i=1;i+(1<<j)-1<=n;i++) dp2[i][j]=max(dp2[i][j-1],dp2[i+(1<<(j-1))][j-1]); } int RMQ1(int l,int r) { int k=0; while((1<<(k+1))<=r-l+1) k++; return min(dp1[l][k],dp1[r-(1<<k)+1][k]); } int RMQ2(int l,int r) { int k=0; while((1<<(k+1))<=r-l+1) k++; return max(dp2[l][k],dp2[r-(1<<k)+1][k]); } int main() { while(~scanf("%d%d",&n,&m)){ for(int i=1;i<=n;i++) scanf("%d",&a[i]); RMQ_init1(); RMQ_init2(); while(m--){ int a,b; scanf("%d%d",&a,&b); printf("%d\n",RMQ2(a,b)-RMQ1(a,b)); } } return 0; }