社区讨论
30pts求条
P3130[USACO15DEC] Counting Haybale P参与者 2已保存回复 3
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 3 条
- 当前快照
- 1 份
- 快照标识符
- @mhz47kvd
- 此快照首次捕获于
- 2025/11/15 01:11 4 个月前
- 此快照最后确认于
- 2025/11/16 13:45 4 个月前
CPP
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define endl '\n'
#define ll f << 1
#define rr f << 1 | 1
const int N = 2e5 + 10;
int tr[N << 2],tag[N << 2],mi[N << 2];
int n,m;
int a[N];
struct node{
void work(int f,int l,int r,int k){
mi[f] += k;
tag[f] += k;
tr[f] += (r - l + 1) * k;
}
void get_num(int f){
tr[f] = tr[ll] + tr[rr];
mi[f] = min(mi[ll],mi[rr]);
}
void build(int f,int l,int r){
if(l == r){
mi[f] = a[l];
tr[f] = a[l];
return;
}
int mid = l + r >> 1;
build(ll,l,mid);
build(rr,mid + 1,r);
get_num(f);
}
void send(int f,int l,int r){
if(tag[f]){
int mid = l + r >> 1;
work(ll,l,mid,tag[f]);
work(rr,mid + 1,r,tag[f]);
tag[f] = 0;
}
}
void change(int f,int l,int r,int x,int y,int k){
if(x <= l and r <= y){
work(f,l,r,k);
return;
}
send(f,l,r);
int mid = l + r >> 1;
if(x <= mid)change(ll,l,mid,x,y,k);
if(y > mid)change(rr,mid + 1,r,x,y,k);
get_num(f);
}
int query(int f,int l,int r,int x,int y,char op){
if(op == 'M'){
if(x <= l and r <= y){
return mi[f];
}
send(f,l,r);
int ans = 0x3f3f3f;
int mid = l + r >> 1;
if(x <= mid)ans = query(ll,l,mid,x,y,op);
if(y > mid)ans = min(ans,query(rr,mid + 1,r,x,y,op));
return ans;
}
if(op == 'S'){
if(x <= l and r <= y){
return tr[f];
}
send(f,l,r);
int ans = 0;
int mid = l + r >> 1;
if(x <= mid)ans += query(ll,l,mid,x,y,op);
if(y > mid)ans += query(rr,mid + 1,r,x,y,op);
return ans;
}
}
}tree;
signed main(){
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
cin >> n >> m;
for(int i = 1;i <= n;i ++){
cin >> a[i];
}
tree.build(1,1,n);
for(int i = 1;i <= m;i ++){
char op;
int x,y,k;
cin >> op >> x >> y;
if(op == 'M'){
cout << tree.query(1,1,n,x,y,op) << endl;
}
if(op == 'P'){
cin >> k;
tree.change(1,1,n,x,y,k);
}
if(op == 'S'){
cout << tree.query(1,1,n,x,y,op) << endl;
}
}
return 0;
}
回复
共 3 条回复,欢迎继续交流。
正在加载回复...