只打一颗线段树求调
查看原帖
只打一颗线段树求调
759274
Stevehim楼主2023/4/12 21:38

rt

#include <iostream>
#define maxn 1000010
using namespace std;
struct node {
	int l,r;
	int sum = 0;
	int add = 0;
	int flag = false;
} a[maxn];
int q[maxn];
int p1[maxn] = {0};
int n,q1;
int sum;
//bool flag[maxn] = {false};

void build(int l,int r,int p) {
	a[p].l = l;
	a[p].r = r;
	if(l == r) {
		a[p].sum = 0;
		return;
	}
	int mid = (l + r) / 2;
	build(l,mid,p*2);
	build(mid+1,r,p*2+1);
	a[p].sum = a[p*2].sum + a[p*2+1].sum;
	return;
}

void spread(int p) {
	if(a[p].add) {
		if(a[p * 2 + 1].flag ==true) { //被打爆了
			a[p*2+1].sum += (a[p*2+1].r - a[p*2+1].l + 1) * a[p].add * 2;
		} else {
			a[p*2+1].sum += (a[p*2+1].r - a[p*2+1].l + 1) * a[p].add;
			if(a[p*2 + 1].sum > q[p*2+1]) a[p*2 + 1].flag = true;
		}
		if(a[p * 2].flag ==true) { //被打爆了
			a[p*2].sum += (a[p*2].r - a[p*2].l + 1) * a[p].add * 2;
		} else {
			a[p*2].sum += (a[p*2].r - a[p*2].l + 1) * a[p].add;
			if(a[p*2].sum > q[p*2]) a[p*2].flag = true;
		}
		a[p*2].add += a[p].add;
		a[p*2+1].add += a[p].add;
		a[p].add = 0;
	}
}

void change(int p,int l,int r,int x) {
	if(l <= a[p].l && r >= a[p].r) {
		a[p].add += x;
		a[p].sum += x * (a[p].r - a[p].l + 1);
		if(a[p].sum > q[p]) a[p].flag = true;
		return;
	}
	spread(p);
	int mid = (a[p].l + a[p].r) / 2;
	if(l <= mid) {
		change(p*2,l,r,x);
	}
	if(r > mid) {
		change(p*2+1,l,r,x);
	}
	a[p].sum = a[p*2].sum + a[p*2+1].sum;
	return;
}

int query(int p,int x) {
	if(a[p].l == a[p].r) {
		return a[p].sum;
	}
	spread(p);
	int mid = (a[p].l + a[p].r) / 2;
	if(mid >= x) {
		return query(p*2,x);
	}
	if(mid < x) {
		return query(p*2+1,x);
	}
}

int main() {
	cin >> n >> q1;
	for(int i = 1; i <= n; i++) {
		cin >> q[i];
	}
	build(1,n,1);
	char ch;
	int l,r,a,x;
	for(int i = 1; i <= q1; i++) {
		cin >> ch;
		if(ch == 'A') {
			cin >> l >> r >> a;
			change(1,l,r,a);
		} else {
			cin >> x;
			sum += query(1,x);;
		}
	}
	cout << sum << endl;
	return 0;
}

2023/4/12 21:38
加载中...