零分求助,第二个样例过了!!!!!!!!!!!!!!!

P1253 扶苏的问题

Anonymous__user @ 2022-07-13 11:20:52

#include<bits/stdc++.h>
using namespace std;
long long nn,mm,op,l,r,x,a[1000010],da;
struct shu{
    long long ll,rr,Max,bj,bj2;
}tt[4000010];
void jian(long long i,long long zuo,long long you){
    tt[i].ll=zuo;
    tt[i].rr=you;
    tt[i].bj=12349999496383248888;
    if(l==r){
        tt[i].Max=a[l];
        return;
    }
    jian(i*2,zuo,(zuo+you)/2);
    jian(i*2+1,(zuo+you)/2+1,you);
    tt[i].Max=max(tt[i*2].Max,tt[i*2+1].Max);
}
void xia(long long i){
    if(tt[i].bj==12349999496383248888 && tt[i].bj2==0)
        return;
    if(tt[i].bj!=12349999496383248888){
        tt[i*2].bj=tt[i].bj;
        tt[i*2+1].bj=tt[i].bj;
        tt[i*2].bj2=tt[i].bj2;
        tt[i*2+1].bj2=tt[i].bj2;
        tt[i*2].Max=tt[i].bj+tt[i].bj2;
        tt[i*2+1].Max=tt[i].bj+tt[i].bj2;
        tt[i].bj=12349999496383248888;
        tt[i].bj2=0;
    }   
    else{
        tt[i*2].bj2+=tt[i].bj2;
        tt[i*2+1].bj2+=tt[i].bj2;
        tt[i*2].Max+=tt[i].bj2;
        tt[i*2+1].Max+=tt[i].bj2;
        tt[i].bj2=0;
    }
}
void st1(long long i){
    if(l<=tt[i].rr && r>=tt[i].ll){
        if(l<=tt[i].ll && r>=tt[i].rr){
            tt[i].bj=x;
            tt[i].bj2=0;
            tt[i].Max=x;
            return;
        }
        xia(i);
        st1(i*2);
        st1(i*2+1);
        tt[i].Max=max(tt[i*2].Max,tt[i*2+1].Max);
    }
}
void st2(long long i){
    if(l<=tt[i].rr && r>=tt[i].ll){
        if(l<=tt[i].ll && r>=tt[i].rr){
            tt[i].bj2+=x;
            tt[i].Max+=x;
            return;
        }
        xia(i);
        st2(i*2);
        st2(i*2+1);
        tt[i].Max=max(tt[i*2].Max,tt[i*2+1].Max);
    }
}
void st3(long long i){
    if(l<=tt[i].rr && r>=tt[i].ll){
        if(l<=tt[i].ll && r>=tt[i].rr){
            da=max(da,tt[i].Max);
            return;
        }
        xia(i);
        st3(i*2);
        st3(i*2+1);
    }
}
int main(){
    cin>>nn>>mm;
    for(int i=1;i<=nn;i++)cin>>a[i];
    jian(1,1,nn);
    for(int i=1;i<=mm;i++){
        cin>>op;
        if(op==1){
            cin>>l>>r>>x;
            st1(1);
        }
        if(op==2){
            cin>>l>>r>>x;
            st2(1);
        }
        if(op==3){
            da=-1234476487885688;
            cin>>l>>r;
            st3(1);
            cout<<da<<endl;
        }
    }
    return 0;
}

by irris @ 2022-07-13 11:33:15

把你那个 123 什么玩意后面加个 ll(?)


by WanderingTrader @ 2022-07-13 11:52:57

@sky13968662232 无穷大建议采用16进制,不会出现溢出的问题

比如

long long INF1=0x3f3f3f3f3f3f3f3f;
long long INF2=1e16;
long long INF3=1234567812345678;

(8个3f)

前两个是不会溢出的,但如果像第三个那样直接写数字就会溢出(因为默认是int)


|