线段树二分wa #11 #12求条
查看原帖
线段树二分wa #11 #12求条
746761
zzb1217楼主2024/10/22 07:38
#include <bits/stdc++.h>
#define int long long 
using namespace std;
const int N = 1e6 + 10;
struct Tree {
	int val, lz, l, r;
}tr[N];
int n, Q, a[N], w;
string A;
void build(int id, int l, int r) {
	tr[id].l = l, tr[id].r = r, tr[id].lz = 0;
	if (l == r) {
		tr[id].val = a[l];
		return ;
	}
	int mid = (l + r) >> 1;
	build(id * 2, l, mid);
	build(id * 2 + 1, mid + 1, r);
	tr[id].val = tr[id * 2].val + tr[id * 2 + 1].val;
}
void push_down(int id) {
	tr[id * 2].lz += tr[id].lz;
	tr[id * 2 + 1].lz += tr[id].lz;
	tr[id * 2].val += (tr[id * 2].r - tr[id * 2].l + 1) * tr[id].lz;
	tr[id * 2 + 1].val += (tr[id * 2 + 1].r - tr[id * 2 + 1].l + 1) * tr[id].lz;
	tr[id].lz = 0;
}
void upd(int id, int l, int r, int k) {
	if (l <= tr[id].l && tr[id].r <= r) {
		tr[id].lz += k;
		tr[id].val += (tr[id].r - tr[id].l + 1) * k;
		return ;
	}
	push_down(id);
	if (tr[id * 2].r >= l) upd(id * 2, l, r, k);
	if (tr[id * 2 + 1].l <= r) upd(id * 2 + 1, l, r, k);
	tr[id].val = tr[id * 2].val + tr[id * 2 + 1].val;
}
int sum(int id, int l, int r) {
	if (l <= tr[id].l && tr[id].r <= r) {
		return tr[id].val;
	}
	push_down(id);
	int ans = 0;
	if (tr[id * 2].r >= l) ans += sum(id * 2, l, r);
	if (tr[id * 2 + 1].l <= r) ans += sum(id * 2 + 1, l, r);
	return ans;
}
int solve(int x) {
	int cnt = 0, y = x, kw = w;
	int qwq = 0;
	while (kw > 0) {
		if (kw - y < 0) break;
		kw -= y;
		qwq += y;
		y *= 2;
		cnt++;
	}
	if (kw == 0) {
		return cnt * n - 1;
	}
	int l = 1, r = n, ans = 0;
	while (l <= r) {
		int mid = (l + r) >> 1;
		int s = sum(1, 1, mid) * (1<<cnt);
		if (s + qwq >= w) r = mid - 1;
		else {
			l = mid + 1;
			ans = mid;
		}
	}
	return ans + cnt * n; 
}
signed main() {
//	freopen("1.in","r",stdin);
//	freopen("1.out","w",stdout);
	ios::sync_with_stdio(0);
	cin.tie(0), cout.tie(0)	;
	cin >> n >> Q >> w;
	for (int i = 1; i <= n; ++i) {
		cin >> a[i];
	}
	build(1, 1, n);
	while (Q--) {
		int l, r, d;
		cin >> l >> r >> d;	
		upd(1, l, r, d);
		cout << solve(sum(1, 1, n)) << '\n';
	}
	return 0;
}
2024/10/22 07:38
加载中...