60pts求助,过了样例

P1253 扶苏的问题

jqsh @ 2022-01-22 11:02:41

  • 已调试数天
    #include<bits/stdc++.h>
    using namespace std;
    long long n,a,q;
    long long dis[8000001],m[8000001][2],ad[8000001][2];
    long long read(){
    long long k=0,k1=1;
    char ch=getchar();
    while(!isdigit(ch)){
        if(ch=='-') k1=-1;
        ch=getchar();
    }
    while(isdigit(ch)){
        k=(k<<1)+(k<<3)+(ch^48);
        ch=getchar();
    }
    return k*k1;
    }
    void upd(long long k,long long x,long long y){
    long long mid=(x+y)/2;
    if(m[k][1]){
        m[k<<1][1]=1;m[k<<1][0]=m[k][0];
        m[k<<1|1][1]=1;m[k<<1|1][0]=m[k][0];
        dis[k]=m[k][0];
        m[k][0]=m[k][1]=0;
        ad[k][0]=ad[k][1]=0;
        ad[k<<1][0]=0;ad[k<<1][1]=-1;
        ad[k<<1|1][0]=0;ad[k<<1|1][1]=-1;
        return;
    }   
    if(ad[k][1]==1){
        ad[k<<1][0]+=ad[k][0];
        ad[k<<1|1][0]+=ad[k][0];
        ad[k<<1][1]=ad[k<<1|1][1]=1;    
        dis[k]+=ad[k][0];
        ad[k][0]=ad[k][1]=0;
    }
    else if(ad[k][1]==-1){
        ad[k<<1][1]=ad[k<<1|1][1]=-1;
        ad[k][0]=ad[k][1]=0;
    }
    return;
    }
    void adb(long long k,long long x,long long y,long long s,long long e){
    if(x>e||y<e) return;
    if(x==y&&x==e){
        dis[k]=s;
        return;
    }
    long long mid=(x+y)/2;
    adb(k<<1,x,mid,s,e);
    adb(k<<1|1,mid+1,y,s,e);
    dis[k]=max(dis[k<<1],dis[k<<1|1]);
    return;
    }
    void adm(long long k,long long x,long long y,long long l,long long r,long long s){
    upd(k,x,y);
    if(y<l||x>r) return;
    if(x>=l&&y<=r){
        m[k][0]=s;m[k][1]=1;
        ad[k][0]=0;ad[k][1]=-1;
        dis[k]=s;
        upd(k,x,y);
        return;
    }
    long long mid=(x+y)/2;
    adm(k<<1,x,mid,l,r,s);
    adm(k<<1|1,mid+1,y,l,r,s);
    dis[k]=max(dis[k<<1],dis[k<<1|1]);
    upd(k,x,y);
    return;
    }
    void add(long long k,long long x,long long y,long long l,long long r,long long s){
    upd(k,x,y);
    if(y<l||x>r) return;
    long long mid=(x+y)/2;
    if(x>=l&&y<=r){ 
        ad[k<<1][0]+=s;ad[k<<1][1]=1;
        ad[k<<1|1][0]+=s;ad[k<<1|1][1]=1;
        dis[k]+=s;
        upd(k,x,y);
        return;
    }
    add(k<<1,x,mid,l,r,s);
    add(k<<1|1,mid+1,y,l,r,s);
    dis[k]=max(dis[k<<1],dis[k<<1|1]);
    upd(k,x,y);
    return;
    }
    long long find(long long k,long long x,long long y,long long l,long long r){
    upd(k,x,y);
    if(y<l||x>r) return -0x3f3f3f3f3f;
    long long mid=(x+y)/2;
    if(x>=l&&y<=r){
        return dis[k];
    }
    return max(find(k<<1|1,mid+1,y,l,r),find(k<<1,x,mid,l,r));
    }
    int main(){
    n=read();q=read();
    for(long long i=1;i<=n*4;i++) dis[i]=-0x3f3f3f3f3f;
    for(long long i=1;i<=n;i++){
        a=read();
        adb(1,1,n,a,i);
    }
    while(q--){
        long long op;
        op=read();
        long long l,r,x;
        if(op==1){
            l=read();r=read();x=read();
            if(l>r) swap(l,r);
            adm(1,1,n,l,r,x);
        }
        if(op==2){
            l=read();r=read();x=read();
            if(l>r) swap(l,r);
            add(1,1,n,l,r,x);
        }
        if(op==3){
            l=read();r=read();
            if(l>r) swap(l,r);
            printf("%lld\n",find(1,1,n,l,r));
        }
    }
    return 0;
    }

by Elgo87 @ 2022-01-22 11:13:28

@jqsh 这缩进太……太有特色了 /ll


by x0d5_n14R @ 2022-01-22 11:22:47

估计和我之前一样下传标记假了,可以再查一查。


by jqsh @ 2022-01-26 12:52:03

@Elgo87 本来还行,但粘贴上去后就变成了怪怪的样子


by jqsh @ 2022-01-26 12:55:43

#include<bits/stdc++.h>
using namespace std;
long long n,a,q;
long long dis[8000001],m[8000001][2],ad[8000001][2];
long long read(){
    long long k=0,k1=1;
    char ch=getchar();
    while(!isdigit(ch)){
        if(ch=='-') k1=-1;
        ch=getchar();
    }
    while(isdigit(ch)){
        k=(k<<1)+(k<<3)+(ch^48);
        ch=getchar();
    }
    return k*k1;
}
void upd(long long k,long long x,long long y){
    long long mid=(x+y)/2;
    if(m[k][1]){
        m[k<<1][1]=1;m[k<<1][0]=m[k][0];
        m[k<<1|1][1]=1;m[k<<1|1][0]=m[k][0];
        dis[k]=m[k][0];
        m[k][0]=m[k][1]=0;
        ad[k][0]=0;ad[k][1]=-1;
        return;
    }   
    if(ad[k][1]==1){
        ad[k<<1][0]+=ad[k][0];
        ad[k<<1|1][0]+=ad[k][0];
        ad[k<<1][1]=ad[k<<1|1][1]=1;    
        dis[k]+=ad[k][0];
        ad[k][0]=ad[k][1]=0;
    }
    else if(ad[k][1]==-1){
        ad[k<<1][1]=ad[k<<1|1][1]=-1;
        ad[k][0]=ad[k][1]=0;
    }
    return;
}
void adb(long long k,long long x,long long y,long long s,long long e){
    if(x>e||y<e) return;
    if(x==y&&x==e){
        dis[k]=s;
        return;
    }
    long long mid=(x+y)/2;
    adb(k<<1,x,mid,s,e);
    adb(k<<1|1,mid+1,y,s,e);
    dis[k]=max(dis[k<<1],dis[k<<1|1]);
    return;
}
void adm(long long k,long long x,long long y,long long l,long long r,long long s){
    upd(k,x,y);
    if(y<l||x>r) return;
    if(x>=l&&y<=r){
        m[k][0]=s;m[k][1]=1;
        ad[k][0]=0;ad[k][1]=-1;
        dis[k]=s;
        upd(k,x,y);
        return;
    }
    long long mid=(x+y)/2;
    adm(k<<1,x,mid,l,r,s);
    adm(k<<1|1,mid+1,y,l,r,s);
    dis[k]=max(dis[k<<1],dis[k<<1|1]);
    upd(k,x,y);
    return;
}
void add(long long k,long long x,long long y,long long l,long long r,long long s){
    upd(k,x,y);
    if(y<l||x>r) return;
    long long mid=(x+y)/2;
    if(x>=l&&y<=r){
        ad[k<<1][0]+=s;ad[k<<1][1]=1;
        ad[k<<1|1][0]+=s;ad[k<<1|1][1]=1;
        dis[k]+=s;
        upd(k,x,y);
        return;
    }
    add(k<<1,x,mid,l,r,s);
    add(k<<1|1,mid+1,y,l,r,s);
    dis[k]=max(dis[k<<1],dis[k<<1|1]);
    upd(k,x,y);
    return;
}
long long find(long long k,long long x,long long y,long long l,long long r){
    upd(k,x,y);
    if(y<l||x>r) return -0x3f3f3f3f3f;
    long long mid=(x+y)/2;
    if(x>=l&&y<=r){
        return dis[k];
    }
    return max(find(k<<1|1,mid+1,y,l,r),find(k<<1,x,mid,l,r));
}
int main(){
    n=read();q=read();
    for(long long i=1;i<=n*4;i++) dis[i]=-0x3f3f3f3f3f;
    for(long long i=1;i<=n;i++){
        a=read();
        adb(1,1,n,a,i);
    }
    while(q--){
        long long op;
        op=read();
        long long l,r,x;
        if(op==1){
            l=read();r=read();x=read();
            if(l>r) swap(l,r);
            adm(1,1,n,l,r,x);
        }
        if(op==2){
            l=read();r=read();x=read();
            if(l>r) swap(l,r);
            add(1,1,n,l,r,x);
        }
        if(op==3){
            l=read();r=read();
            if(l>r) swap(l,r);
            printf("%lld\n",find(1,1,n,l,r));
        }
    }
    return 0;
}

by jqsh @ 2022-01-26 12:56:14

@jqsh emmm...突然好了...


|