50分求助
  • 板块P1531 I Hate It
  • 楼主tanghg
  • 当前回复2
  • 已保存回复2
  • 发布时间2022/9/3 07:06
  • 上次更新2023/10/27 12:46:02
查看原帖
50分求助
692647
tanghg楼主2022/9/3 07:06

rt,十分感谢

#include<cstdio>
#include <iostream>
using namespace std;
typedef long long ll;
const ll MAXN=1e5+5;
ll w[MAXN*4],a[MAXN],n,q;
inline ll ls(ll u){return u<<1;}
inline ll rs(ll u){return u<<1|1;}
void push_back(const ll u){w[u]=max(w[ls(u)],w[rs(u)]);}
void build(const ll u,ll l,ll r){
    if(l==r){
        w[u]=a[l];
        return;
    }
    ll mid=(l+r)>>1;
    build(ls(u),l,mid);
    build(rs(u),mid+1,r);
    push_back(u);
}
bool in(ll L,ll R,ll l,ll r,bool t){return t?(l<=L)&&(R<=r):!((R<l)||(L>r));}
ll query(ll u,ll L,ll R,ll l,ll r,ll mod=-1){
    if(in(L,R,l,r, true)){
        return w[u];
    }else if(in(L,R,l,r, false)){
        ll mid=(L+R)>>1;
        return max(query(ls(u),L,mid,l,r),query(rs(u),mid+1,R,l,r));
    }else{return 0;}
}
void update(ll u,ll l,ll r,ll t,ll x){
    if(l==r&&l==t&&r==t){
        if(w[u]<x){
            w[u]=x;
            return;
        }
    }
    ll mid=(l+r)>>1;
    if(t<=mid){
        update(ls(u),l,mid,t,x);
    }else{
        update(rs(u),mid+1,r,t,x);
    }
    push_back(u);
}
int main(){
    scanf("%lld%lld",&n,&q);
    for (int i = 1; i <=n ; ++i) {
        scanf("%lld",&a[i]);
    }
    build(1,1,n);
    for (int i = 1; i <=q ; ++i) {
        char op;
        ll A,B;
        cin>>op;
        scanf("%lld%lld",&A,&B);
        if(op=='U'){
            update(1,1,n,A,B);
        }else{
            printf("%lld\n", query(1,1,n,A,B));
        }
    }
    return 0;
}

顺便问一下我query第二个if写的是直接判断一部分相交然后return,但我看很多人在这个部分写的是if(l<=mid) (递归部分)

if(mid<r) (递归部分)

二者有什么区别吗

2022/9/3 07:06
加载中...