问?

P2367 语文成绩

sheep_dream @ 2024-04-23 19:19:10

为什么线段树无法解决这个题

#include<bits/stdc++.h>
using namespace std;
const int N=5e6+10;
typedef long long LL;
LL sum[N*4],add[N*4];//add延时标记
int a[N];
int n,m;
// void change(int k,int l,int r,int v)
// void pushup(int k)
// void pudown(int k,int l,int r)
// void build(int k,int l,int r)
void change(int k,int l,int r,int v){
    sum[k]+=(LL)v*(r-l+1);
    add[k]+=v;
}
void pushup(int k){
    sum[k]=sum[k<<1]+sum[k<<1|1];
}
void pushdown(int k,int l,int r){
    if(add[k]!=0){
        int mid=l+r>>1;
        change(k<<1,l,mid,add[k]);
        change(k<<1|1,mid+1,r,add[k]);
        add[k]=0;
    }
}
//--
void build(int k,int l,int r){
    if(l==r){
        sum[k]=a[l];
        return ;
    }
    //创建子树
    int mid=l+r>>1;
    build(k<<1,l,mid);
    build(k<<1|1,mid+1,r);
    //清除完成
    pushup(k);
}
//--
//区间修改
/*
节点编号为k,管理的区间为[l,r]
将[x,y]的区间,每个值都增加v
*/
void update(int k,int l,int r,int x,int y,int v){
    if(l>=x && r<=y){
        change(k,l,r,v);
        return;
    }
    pushdown(k,l,r);
    int mid=l+r>>1;
    if(x<=mid) update(k<<1,l,mid,x,y,v);
    if(y>=mid+1) update(k<<1|1,mid+1,r,x,y,v);
    pushup(k);
}

//区间查询
LL query(int k,int l,int r,int x,int y){
    if(l>=x && r<=y){
        return sum[k];
    }
    pushdown(k,l,r);
    int mid=l+r>>1;
    LL res=0;
    if(x<=mid) res=query(k<<1,l,mid,x,y);
    if(y>=mid+1) res+=query(k<<1|1,mid+1,r,x,y);
    pushup(k);
    return res;

}

signed main(){
    cin>>n>>m;
    for(int i=1;i<=n;i++){
        cin>>a[i];
    }
    build(1,1,n);
    int x,y;
    int d;
    while(m--){
        cin>>x>>y;
        cin>>d;
        update(1,1,n,x,y,d);
    }
    long long int minn=1000100;
    for(int i=1;i<=n;i++){
        x=i,y=i;
        minn=min(minn,query(1,1,n,x,y) );
    }
    cout<<minn<<endl;
    return 0;
}

by Kevinx @ 2024-04-23 19:35:38

47行改为

if(x<=l && r<=y){

by Kevinx @ 2024-04-23 19:38:44

@sheep_dream


|