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