社区讨论

后6点TLE求调,玄关,马蜂良好

P1253扶苏的问题参与者 2已保存回复 5

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
5 条
当前快照
1 份
快照标识符
@mi5udgf4
此快照首次捕获于
2025/11/19 18:10
4 个月前
此快照最后确认于
2025/11/21 00:01
4 个月前
查看原帖
马蜂良好,但并不能解决tle问题:(
新学线段树
CPP
#include<bits/stdc++.h>
#define int long long
#define endl '\n'
#define max(WJ,XXG) WJ>=XXG?WJ:XXG
#define min(WJ,XXG) WJ<=XXG?WJ:XXG
using namespace std;
const int N=1e6+10;
const int inf=-1145141919810;
struct Tree{
    int l,r,tag,tagg,ans;
}t[N<<2];
int n,q,a[N];
char op;
inline void maxx(int i){t[i].ans=max(t[i<<1].ans,t[i<<1|1].ans);}
inline void build(int l,int r,int i){
    t[i].l=l;t[i].r=r;
    t[i].tagg=inf;
    t[i].tag=0;
    t[i].ans=0;
    if(l==r){
        t[i].ans=a[l];
        return;
    }int mid=(l+r)>>1;
    build(l,mid,i<<1);
    build(mid+1,r,i<<1|1);
    maxx(i);
}void spread(int i){
    if(t[i].tagg!=inf){
        t[i<<1].tagg=t[i].tagg;
        t[i<<1].ans=t[i].tagg;
        t[i<<1|1].ans=t[i].tagg;
        t[i<<1|1].tagg=t[i].tagg;
        t[i].tagg=inf;
        t[i<<1].tag=0;
        t[i<<1|1].tag=0;
    }if(t[i].tag){
        t[i<<1].ans+=t[i].tag;
        t[i<<1|1].ans+=t[i].tag;
        t[i<<1].tag+=t[i].tag;
        t[i<<1|1].tag+=t[i].tag;
        t[i].tag=0;
    }
}void change(int l,int r,int i,int x){
    if(l<=t[i].l&&t[i].r<=r){
        t[i].tag+=x;
        t[i].ans+=x;
        return;
    }spread(i);
    int mid=(t[i].l+t[i].r)>>1;
    if(l<=mid) change(l,r,i<<1,x);
    if(r>mid) change(l,r,i<<1|1,x);
    maxx(i);
}void cchange(int l,int r,int i,int x){
    if(l<=t[i].l&&t[i].r<=r){
        t[i].tag=0;
        t[i].ans=x;
        t[i].tagg=x;
        return;
    }spread(i);
    int mid=(t[i].l+t[i].r)>>1;
    if(l<=mid) cchange(l,r,i<<1,x);
    if(r>mid) cchange(l,r,i<<1|1,x);
    maxx(i);
}int ask(int l,int r,int i){
    if(l<=t[i].l&&t[i].r<=r)
        return t[i].ans;
    spread(i);
    int mid=(t[i].l+t[i].r)>>1,cnt=inf;
    if(l<=mid) cnt=max(cnt,ask(l,r,i<<1));
    if(r>mid) cnt=max(cnt,ask(l,r,i<<1|1));
    return cnt;
}
signed main(){
    ios::sync_with_stdio(0);
    cin.tie(nullptr);cout.tie(nullptr);
    cin>>n>>q;
    for(int i=1;i<=n;i++)
        cin>>a[i];
    build(1,n,1);
    while(q--){
        cin>>op;
        int l,r,x;
        cin>>l>>r;
        if(op=='1'){
            cin>>x;
            cchange(l,r,1,x);
        }else if(op=='2'){
            cin>>x;
            change(l,r,1,x);
        }else
            cout<<ask(l,r,1)<<endl;
    }
    return 0;
}

回复

5 条回复,欢迎继续交流。

正在加载回复...