线段树求助
  • 板块学术版
  • 楼主AffineRing
  • 当前回复1
  • 已保存回复1
  • 发布时间2021/2/6 10:39
  • 上次更新2023/11/5 03:39:59
查看原帖
线段树求助
399250
AffineRing楼主2021/2/6 10:39

题目大致是说给出q个询问,每次询问一段区间中最大值和最小值的差。

然后我这个线段树不知道为什么输入的区间是2 2的时候它的输出区间是2 3……

#include<bits/stdc++.h>
using namespace std;
inline int read(){
    int s=0,w=1;char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
    while(ch>='0'&&ch<='9'){s=s*10+ch-'0';ch=getchar();}
    return s*w;
}
const int MAXN=50005;
struct Tree{int l,r,mx,mn;}t[MAXN*4];
int a[MAXN],n,q;
void build(int l,int r,int p){
    t[p].l=l,t[p].r=r;
    if(t[p].l==t[p].r){
        t[p].mx=a[l],t[p].mn=a[l];
        return;
    }
    int mid=l+r>>1;
    build(l,mid,p*2);
    build(mid+1,r,p*2+1);
    t[p].mx=max(t[p*2].mx,t[p*2+1].mx);
    t[p].mn=min(t[p*2].mn,t[p*2+1].mn); 
}
int askmx(int l,int r,int p){
    if(l<=t[p].l&&r>=t[p].r)return t[p].mx;
    int mid=t[p].l+t[p].r>>1;
    int mx=-(1<<20);
    if(l<=mid)mx=max(mx,askmx(l,mid,p*2));
    if(r>mid)mx=max(mx,askmx(mid+1,r,p*2+1));
    return mx;
}
int askmn(int l,int r,int p){
    if(l<=t[p].l&&r>=t[p].r)return t[p].mn;
    int mid=t[p].l+t[p].r>>1;
    int mn=1<<20;
    if(l<=mid)mn=min(mn,askmn(l,mid,p*2));
    if(r>mid)mn=min(mn,askmn(mid+1,r,p*2+1));
    return mn;
}
int main(){
    n=read(),q=read();
    for(register int i=1;i<=n;i++)a[i]=read();
    build(1,n,1);
    while(q--){
        int l=read(),r=read();
        printf("%d\n",askmx(l,r,1)-askmn(l,r,1));
    }
    return 0;
}

这里有张图

注意到我这个程序输入2 2的时候给输出的是2 3得结果,但是我查不出来哪里错了,所以各位能帮忙查一下错吗……

2021/2/6 10:39
加载中...