社区讨论
线段树板子10分求条 #1AC 玄关
P3130[USACO15DEC] Counting Haybale P参与者 2已保存回复 5
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 5 条
- 当前快照
- 1 份
- 快照标识符
- @mhj3bsbf
- 此快照首次捕获于
- 2025/11/03 20:02 4 个月前
- 此快照最后确认于
- 2025/11/03 20:02 4 个月前
CPP
#include <bits/stdc++.h>
using namespace std;
long long a[200005],n,q;
struct node{
long long l,r,zhi,minn,lz;
}shu[800005];
void build(long long l,long long r,long long id){
shu[id].l = l;
shu[id].r = r;
if(l == r){
shu[id].zhi = a[l];
shu[id].minn = a[l];
return;
}
long long mid = (l+r)/2;
build(l,mid,id*2);
build(mid+1,r,id*2+1);
shu[id].zhi = shu[2*id].zhi + shu[2*id+1].zhi;
shu[id].minn = min(shu[2*id].minn,shu[2*id+1].minn);
}
void pushdown(long long id){
if(shu[id].l == shu[id].r) return;
if(shu[id].lz != 0){
shu[2*id].lz += shu[id].lz;
shu[2*id+1].lz += shu[id].lz;
shu[2*id].zhi += (shu[2*id].r-shu[2*id].l+1)*shu[id].lz;
shu[2*id+1].zhi += (shu[2*id+1].r-shu[2*id+1].l+1)*shu[id].lz;
shu[2*id].minn += shu[id].lz;
shu[2*id+1].minn += shu[id].lz;
shu[id].lz = 0;
}
}
void jia(long long l,long long r,long long c,long long id){
if(shu[id].l >= l && shu[id].r<= r){
shu[id].zhi += (shu[id].r-shu[id].l+1)*c;
shu[id].minn += c;
shu[id].lz += c;
pushdown(id);
return;
}
if(shu[id].l == shu[id].r ) return;
if(l <= shu[2*id].r) jia(l,r,c,2*id);
if(r >= shu[2*id+1].l) jia(l,r,c,2*id+1);
shu[id].minn = min(shu[2*id].minn,shu[2*id+1].minn);
shu[id].zhi = shu[2*id].zhi + shu[2*id+1].zhi;
pushdown(id);
}
long long minum(long long l,long long r,long long id){
pushdown(id);
if(shu[id].l >= l && shu[id].r<= r){
return shu[id].minn;
}
long long mum = 1e18;
if(l <= shu[2*id].r) mum = min(mum,minum(l,r,2*id));
if(r >= shu[2*id+1].l) mum = min(mum,minum(l,r,2*id+1));
return mum;
}
long long he(long long l,long long r,long long id){
pushdown(id);
if(shu[id].l >= l && shu[id].r<= r){
return shu[id].zhi;
}
long long mum = 0;
if(l <= shu[2*id].r) mum += he(l,r,2*id);
if(r >= shu[2*id+1].l) mum += he(l,r,2*id+1);
return mum;
}
int main(){
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
cin >> n >> q;
for(long long i = 1;i <= n;i++) cin >> a[i];
build(1,n,1);
while(q--){
char c;
cin >> c;
if(c == 'M'){
long long md1,md2;
cin >> md1 >> md2;
cout << minum(md1,md2,1) << endl;
}
else if(c == 'P'){
long long md1,md2,md3;
cin >> md1 >> md2 >> md3;
jia(md1,md2,md3,1);
}
else{
long long md1,md2;
cin >> md1 >> md2;
cout << he(md1,md2,1) << endl;
}
}
}
回复
共 5 条回复,欢迎继续交流。
正在加载回复...