数组开1e6就Compiler exceeded CPU_TIME limit

P1253 扶苏的问题

bearbearma @ 2022-05-03 21:09:09

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N = 1e6+7;
struct CNM{
    ll add=0;
    ll become=1e10;
};
ll Tree[N*4],a[N];
CNM tag[N*4];
void add1(int id,int l,int r,ll val){
    tag[id].become=val;
    tag[id].add=0;
    Tree[id]=val;
}
void add2(int id,int l,int r,ll val){
    tag[id].add+=val;
    Tree[id]+=val;
}
void push_down(int id,int l,int r){
    if(tag[id].become!=1e10){
        int mid=(l+r)>>1;
        add1(id*2,l,mid,tag[id].become);
        add1(id*2+1,mid+1,r,tag[id].become);
        tag[id].become=1e10;
    }
    if(tag[id].add!=0){
        int mid=(l+r)>>1;
        add2(id*2,l,mid,tag[id].add);
        add2(id*2+1,mid+1,r,tag[id].add);
        tag[id].add=0;
    }
}
void build_tree(int id,int l,int r){
    if(l==r){
        Tree[id]=a[l];return;
    }
    int mid=(l+r)>>1;
    build_tree(id*2,l,mid);
    build_tree(id*2+1,mid+1,r);
    Tree[id]=max(Tree[id*2],Tree[id*2+1]);
}
void ud1(int id,int l,int r,int L,int R,ll val){
    if(l==L&&r==R){
        tag[id].add=0;
        tag[id].become=val;
        Tree[id]=val;
        return;
    }
    int mid=(l+r)>>1;push_down(id,l,r);
    if(R<=mid)ud1(id*2,l,mid,L,R,val);
    else if(L>mid)ud1(id*2+1,mid+1,r,L,R,val);
    else{
        ud1(id*2,l,mid,L,mid,val);
        ud1(id*2+1,mid+1,r,mid+1,R,val);
    }
    Tree[id]=max(Tree[id*2],Tree[id*2+1]);
}
void ud2(int id,int l,int r,int L,int R,ll val){
    if(l==L&&r==R){
        tag[id].add+=val;
        Tree[id]+=val;
        return;
    }
    int mid=(l+r)>>1;push_down(id,l,r);
    if(R<=mid)ud2(id*2,l,mid,L,R,val);
    else if(L>mid)ud2(id*2+1,mid+1,r,L,R,val);
    else{
        ud2(id*2,l,mid,L,mid,val);
        ud2(id*2+1,mid+1,r,mid+1,R,val);
    }
    Tree[id]=max(Tree[id*2],Tree[id*2+1]);
}
ll query(int id,int l,int r,int L,int R){
    if(l==L&&r==R)return Tree[id];
    int mid=(l+r)>>1;push_down(id,l,r);
    if(R<=mid)return query(id*2,l,mid,L,R);
    else if(L>mid)return query(id*2+1,mid+1,r,L,R);
    else return max(query(id*2,l,mid,L,mid),query(id*2+1,mid+1,r,mid+1,R));
    Tree[id]=max(Tree[id*2],Tree[id*2+1]);
}
int main(){
    ios::sync_with_stdio(false);
    cin.tie(NULL),cout.tie(NULL);
    int n,m;cin>>n>>m;
    for(int i=1;i<=n;++i)cin>>a[i];
    build_tree(1,1,n);
    for(int i=1;i<=m;++i){
        int op;cin>>op;
        if(op==1){
            int l,r,x;cin>>l>>r>>x;
            ud1(1,1,n,l,r,x);
        }
        else if(op==2){
            ll l,r,x;cin>>l>>r>>x;
            ud2(1,1,n,l,r,x);
        }
        else{
            ll l,r;cin>>l>>r;
            cout<<query(1,1,n,l,r)<<'\n';
        }
    }
    return 0;
}

by Eric998 @ 2022-05-03 21:15:30

1e6默认为double


|