社区讨论
线段树板子求条
P3130[USACO15DEC] Counting Haybale P参与者 2已保存回复 7
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 7 条
- 当前快照
- 1 份
- 快照标识符
- @m5x9i8sw
- 此快照首次捕获于
- 2025/01/15 10:07 去年
- 此快照最后确认于
- 2025/01/15 14:52 去年
CPP
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int maxn=1000000+10;
int n,m,l,r,a[maxn];
char opt;
struct node{
int L,R,mi,add,sum;
} t[maxn*4];
void down(int id){
t[id*2].add+=t[id].add;
t[id*2].mi+=t[id].add;
t[id*2].sum+=(t[id*2].R-t[id*2].L+1)*t[id].add;
t[id*2+1].add+=t[id].add;
t[id*2+1].mi+=t[id].add;
t[id*2+1].sum+=(t[id*2+1].R-t[id*2+1].L+1)*t[id].add;
t[id].add=0;
}
void build(int id,int l,int r){
t[id].L=l; t[id].R=r;
if(l==r){
t[id].mi=a[l]; t[id].sum=a[l];
return ;
}
int mid=(l+r)/2;
build(id*2,l,mid); build(id*2+1,mid+1,r);
t[id].mi=min(t[id*2].mi,t[id*2+1].mi);
t[id].sum+=t[id*2].sum+t[id*2+1].sum;
}
void update(int id,int l,int r,int val){
if(t[id].L>r || t[id].R<l) return ;
if(t[id].L>=l && t[id].R<=r){
t[id].add+=val;
t[id].mi+=val;
t[id].sum+=(t[id].R-t[id].L+1)*val;
return ;
}
if(t[id].add!=0) down(id);
update(id*2,l,r,val); update(id*2+1,l,r,val);
t[id].mi=min(t[id*2].mi,t[id*2+1].mi);
t[id].sum=t[id*2].sum+t[id*2+1].sum;
}
int ask_mi(int id,int l,int r){
if(t[id].L>r || t[id].R<l) return -0x3f3f;
if(t[id].L>=l && t[id].R<=r) return t[id].mi;
if(t[id].add!=0) down(id);
return min(ask_mi(id*2,l,r),ask_mi(id*2+1,l,r));
}
int ask_sum(int id,int l,int r){
if(t[id].L>r || t[id].R<l) return 0;
if(t[id].L>=l && t[id].R<=r) return t[id].sum;
if(t[id].add!=0) down(id);
return ask_sum(id*2,l,r)+ask_sum(id*2+1,l,r);
}
signed main(){
cin>>n>>m;
for(int i=1;i<=n;i++) cin>>a[i];
build(1,1,n);
while(m--){
cin>>opt>>l>>r;
if(opt=='P'){
int val; cin>>val; update(1,l,r,val);
}
if(opt=='M') cout<<ask_mi(1,l,r)<<'\n';
if(opt=='S') cout<<ask_sum(1,l,r)<<'\n';
}
return 0;
}
回复
共 7 条回复,欢迎继续交流。
正在加载回复...