不求调,求hack(悬关)

P1253 扶苏的问题

Always_Remember_It @ 2023-10-01 23:23:34


#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N=1e6+10;
const int MINN=-1000000000000000001;
int n,q,a[N],num,in[N],lt[N],rt[N],maxn[N],ch[N],past[N];
void block(){
    num=sqrt(n);
    if(num*num!=n) ++num;
    int lar=num;
    if(num*(num-1)>=n&&num*num!=n) --lar;
    for(int i=1;i<num;i++){
        lt[i]=rt[i-1]+1;
        rt[i]=i*lar;
    }
    lt[num]=rt[num-1]+1;
    rt[num]=n;
    for(int i=1;i<=rt[num-1];i++){
        in[i]=(i-1)/lar+1;
    }
    for(int i=lt[num];i<=n;i++){
        in[i]=num;
    }
    for(int i=1;i<=num;i++){
        ch[i]=MINN;
    }
    for(int i=1;i<=num;i++){
        maxn[i]=MINN;
        for(int j=lt[i];j<=rt[i];j++){
            maxn[i]=max(maxn[i],a[j]);
        }
    }
}
void update1(int l,int r,int x){
    if(l==lt[in[l]]&&r==rt[in[r]]){
        past[in[l]]=0;
        ch[in[l]]=x;
        maxn[in[l]]=x;
        return;
    }
    if(ch[in[l]]!=MINN){
        ch[in[l]]+=past[in[l]];
        maxn[in[l]]=max(ch[in[l]],x);
        for(int i=lt[in[l]];i<l;i++){
            a[i]=ch[in[i]];
        }
        for(int i=l;i<=r;i++){
            a[i]=x;
        }
        for(int i=r+1;i<=rt[in[r]];i++){
            a[i]=ch[in[i]];
        }
        ch[in[l]]=MINN;
        past[in[l]]=0;
        return;
    }
    maxn[in[l]]=x;
    for(int i=lt[in[l]];i<l;i++){
        maxn[in[i]]=max(maxn[in[i]],a[i]+past[in[i]]);
    }
    for(int i=l;i<=r;i++){
        a[i]=x;
    }
    for(int i=r+1;i<=rt[in[r]];i++){
        maxn[in[i]]=max(maxn[in[i]],a[i]+past[in[i]]);
    }
    past[in[l]]=0;
}
void change(int l,int r,int x){
    if(in[l]==in[r]){
        update1(l,r,x);
        return;
    }
    update1(l,rt[in[l]],x);
    update1(lt[in[r]],r,x);
    for(int i=in[l]+1;i<in[r];i++){
        past[i]=0;
        ch[i]=x;
        maxn[i]=x;
    }
}
void update2(int l,int r,int x){
    if(l==lt[in[l]]&&r==rt[in[r]]){
        past[in[l]]+=x;
        maxn[in[l]]+=x;
        return;
    }
    if(ch[in[l]]!=MINN){
        maxn[in[l]]+=x;
        for(int i=lt[in[l]];i<l;i++){
            a[i]=ch[in[l]];
        }
        for(int i=l;i<=r;i++){
            a[i]=ch[in[l]]+x;
        }
        for(int i=r+1;i<=rt[in[r]];i++){
            a[i]=ch[in[l]];
        }
        ch[in[l]]=MINN;
        return;
    }
    maxn[in[l]]=MINN;
    for(int i=lt[in[l]];i<l;i++){
        maxn[in[i]]=max(maxn[in[i]],a[i]+past[in[i]]);
    }
    for(int i=l;i<=r;i++){
        a[i]+=x;
        maxn[in[i]]=max(maxn[in[i]],a[i]+past[in[i]]);
    }
    for(int i=r+1;i<=rt[in[r]];i++){
        maxn[in[i]]=max(maxn[in[i]],a[i]+past[in[i]]);
    }
}
void pastsum(int l,int r,int x){
    if(in[l]==in[r]){
        update2(l,r,x);
        return;
    }
    update2(l,rt[in[l]],x);
    update2(lt[in[r]],r,x);
    for(int i=in[l]+1;i<in[r];i++){
        past[i]+=x;
        maxn[i]+=x;
    }
}
int query(int l,int r){
    if(ch[in[l]]!=MINN) return ch[in[l]]+past[in[l]];
    int res=MINN;
    for(int i=l;i<=r;i++){
        res=max(res,a[i]+past[in[i]]);
    }
    return res;
}
int ask(int l,int r){
    if(in[l]==in[r]) return query(l,r);
    int res=max(query(l,rt[in[l]]),query(lt[in[r]],r));
    for(int i=in[l]+1;i<in[r];i++){
        res=max(res,maxn[i]);
    }
    return res;
}
inline int read(){
    int s=0,f=1;
    char ch=getchar();
    while(ch<'0'||ch>'9'){
        if(ch=='-') f=-1;
        ch=getchar();
    }
    while(ch>='0'&&ch<='9'){
        s=(s<<3)+(s<<1)+(ch^48);
        ch=getchar();
    }
    return s*f;
}
signed main(){
    n=read(),q=read();
    for(int i=1;i<=n;i++){
        a[i]=read();
    }
    block();
    for(int i=1;i<=q;i++){
        int op=read(),l=read(),r=read();
        if(op==1){
            int x=read();
            change(l,r,x);
            continue;
        }
        if(op==2){
            int x;cin>>x;
            pastsum(l,r,x);
            continue;
        }
        printf("%lld\n",ask(l,r));
    }
    return 0;
}

by Leianha @ 2023-10-01 23:57:39

4 3
2 1 3 5 
2 1 4 5
1 2 2 1
3 1 1

答案应该是7,你的程序输出2


by Leianha @ 2023-10-01 23:58:25

@Cstdio_Rabbit


by Always_Remember_It @ 2023-10-02 09:11:07

@Leianha 谢谢已关


|