线段树也会超时吗
查看原帖
线段树也会超时吗
832472
yishanyi楼主2024/8/3 18:25

线段树也会超时吗

#include<bits/stdc++.h>
using namespace std;

#define N 1000000
#define ls 2 * u
#define rs 2 * u + 1

int n, m;
struct Node{
	int add, mn;
} t[4 * N];
int a[N];
//int d[N], s[N], p[N];

void up(int u) {
	t[u].mn = min(t[ls].mn, t[rs].mn);
}

void blt(int u, int l, int r, int ql ,int qr) {
	if (l == r) {
		t[u].mn = a[l];
		return;
	}
	int mid = l + (r - l) / 2;
	blt(ls, l, mid, ql, qr), blt(rs, mid + 1, r, ql, qr);
	up(u);
}

void down(int u, int x) {
	t[u].mn += x;
	t[u].add += x;
}

void down(int u) {
	down(ls, t[u].add), down(rs, t[u].add);
	t[u].add = 0;
}

void mlt(int u, int l, int r, int ql, int qr, int x) {
	if (l > qr || r < ql) return;
	if (l >= ql && r <= qr) {
		down(u, x);
		return;
	}
	down(u);
	int mid = l + (r - l) / 2;
	mlt(ls, l, mid, ql, qr, x), mlt(rs, mid + 1, r, ql, qr, x);
	up(u);
}

int qry(int u, int l, int r, int ql, int qr) {
	if (l > qr || r < ql) return 1e9;
	if (l >= ql && r <= qr) return t[u].mn;
	down(u);
	int mid = l + (r - l) / 2;
	return min(qry(ls, l, mid, ql, qr), qry(rs, mid + 1, r, ql, qr));
}

int main() {
	scanf("%d%d", &n, &m);
	for (int i = 1; i <= n; i++) {
		scanf("%d", &a[i]);
	}
	blt(1, 1, n, 1, n);
	int i = 1;
	while (m--) {
		int d, s, p;
		scanf("%d%d%d", &d, &s, &p);
		d = 0 - d;
		mlt(1, 1, n, s, p, d);
		if (qry(1, 1, n, s, p) < 0) {
			printf("%d\n%d", -1, i);
			return 0;
		}
		i++;
	}
	printf("%d", 0);
	return 0;
}
2024/8/3 18:25
加载中...