玄关!站外线段树题求调
  • 板块学术版
  • 楼主Dreeick
  • 当前回复3
  • 已保存回复3
  • 发布时间2024/8/5 12:14
  • 上次更新2024/8/5 13:47:39
查看原帖
玄关!站外线段树题求调
773371
Dreeick楼主2024/8/5 12:14

#include <iostream>
#include <algorithm>
#include <cstring>
#include <vector>
#include <queue>
#include <climits>
#include <string>

using namespace std;

typedef long long ll;
const int N = 200005;
struct Tree{
	int l,r;
	ll sum,add,min_g;
}tr[N*4];
int n,m;
ll a[N];

void pushup(int p){
	tr[p].sum = tr[p << 1].sum + tr[p << 1 | 1].sum;
	tr[p].min_g = min(tr[p << 1].min_g,tr[p << 1 | 1].min_g);
}

void pushdown(int p){
	if(tr[p].add){
		tr[p << 1].sum += tr[p].add*ll(tr[p << 1].r - tr[p<<1].l + 1);
		tr[p << 1].min_g += tr[p].add;
		tr[p << 1].add += tr[p].add;
		tr[p << 1 | 1].sum += tr[p].add * ll(tr[p << 1 | 1].r - tr[p << 1 | 1].l + 1);
		tr[p << 1 | 1].add += tr[p].add;
		tr[p << 1 | 1].min_g += tr[p].add;
		tr[p].add = 0;
	}
}

void build(int p,int l,int r){
	tr[p].l = l;
	tr[p].r = r;
	tr[p].add = 0;
	if(l == r){
		tr[p].sum  = tr[p].min_g = a[l];
		return;
	}
	int mid = l+r >> 1;
	build(p<<1,l,mid);
	build(p<<1 | 1,mid+1,r);
	pushup(p);
}

ll query_sum(int p,int l,int r){
	if(tr[p].l >= l && tr[p].r <= r) return tr[p].sum;
	pushdown(p);
	int mid = tr[p].l + tr[p].r >> 1;
	ll res = 0;
	if(l <= mid) res += query_sum(p << 1,l,r);
	if(r > mid) res += query_sum(p<<1|1,l,r);
	return res;
}

ll query_min(int p,int l,int r){
	if(tr[p].l >= l && tr[p].r <= r) return tr[p].min_g;
	pushdown(p);
	int mid = tr[p].l + tr[p].r >> 1;
	ll res = LONG_LONG_MAX;
	if(l <= mid) res = min(query_min(p<<1,l,r),res);
	if(r > mid) res = min(query_min(p<<1|1,l,r),res);
	return res;
}

void modify(int p,int l,int r,int k){
	if(tr[p].l >= l && tr[p].r <= r){
		tr[p].sum += k*(tr[p].r - tr[p].l + 1);
		tr[p].min_g += k;
		tr[p].add += k;
		return;
	}
	pushdown(p);
	int mid = tr[p].l + tr[p].r >> 1;
	if(l <= mid) modify(p << 1,l,r,k);
	if(r > mid) modify(p << 1 | 1,l,r,k);
	pushup(p);
}

int 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];
	}
	build(1,1,n);
	while(m--){
		char op;
		int x,y,z;
		cin >> op >> x >> y;
		if(op == 'M') cout << query_min(1,x,y) << '\n';
		else if(op == 'P'){
			cin >> z;
			modify(1,x,y,z);
		}
		else cout << query_sum(1,x,y) << '\n';
	}

	return 0;
}

调了很久,不知道哪里错了,希望DALAO指出

2024/8/5 12:14
加载中...