社区讨论

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 条回复,欢迎继续交流。

正在加载回复...