Q
  • 板块学术版
  • 楼主ivnilkkk
  • 当前回复5
  • 已保存回复5
  • 发布时间2024/3/9 11:03
  • 上次更新2024/3/9 11:34:13
查看原帖
Q
1073341
ivnilkkk楼主2024/3/9 11:03

这是一个关于线段树板子的问题。

是之前一个问题的后续。

我现在修改后还是不能实现想要的效果。请问哪里错了呢?

这个问题中 dalao @wql_cai 的 hack 数据我还是过不了。求调,感谢!

#include <bits/stdc++.h>
#define int long long
#define ls p << 1
#define rs p << 1 | 1
using namespace std;

const int N = 1e6+10;
int n, m, a[N], d, x, y, t[N*4];

void build(int p, int l, int r) {
	if(l == r) t[p] = a[l];
	else {
		int mid = (l + r) / 2;
		build(ls, l, mid);
		build(rs, mid + 1, r);
		t[p] = min(t[ls], t[rs]);
	}
}

void modify(int p, int l, int r, int x, int y, int k) {
	if(x <= l && r <= y) t[p] += k;
	else {
		int mid = (l + r) / 2;
		if(x <= mid) modify(ls, l, mid, x, y, k);
		if(y > mid) modify(rs, mid + 1, r, x, y, k);
		t[p] = min(t[ls], t[rs]);
	}
}

int find(int p, int l, int r, int x, int y) {
	if(x <= l && r <= y) return t[p];
	int mid = (l + r) / 2, mi = 1e18;
	if(x <= mid) mi = min(mi, find(ls, l, mid, x, y));
	if(y > mid) mi = min(mi, find(rs, mid + 1, r, x, y));
	return mi;
}

signed main() {
	scanf("%lld%lld", &n, &m);
	for(int i = 1; i <= n; i++)
		scanf("%lld", &a[i]);
	build(1, 1, n);
	for(int i = 1; i <= m; i++) {
		scanf("%lld%lld%lld", &d, &x, &y);
		modify(1, 1, n, x, y, -d);
		if(find(1, 1, n, x, y) < 0) {
			printf("-1\n%lld\n", i);
			return 0;
		}
	}
	printf("0\n");
	return 0;
}
2024/3/9 11:03
加载中...