样例未过求助
查看原帖
样例未过求助
766182
czyzh楼主2023/1/28 19:50

线段树代码应该没错,但样例过不了,提交RE,大佬们帮忙看看,谢谢

#include <bits/stdc++.h>
using namespace std;
const int N = 1e6+100;
typedef long long ll;
int n, m, a[N];
ll minx[N << 2];
inline void push_up(int k)
{
	minx[k] = min(minx[k << 1], minx[k << 1 | 1]);
}
void build(int k, int l, int r)
{
	if(l == r)
	{
		minx[k] = a[l] - a[l - 1];//差分 
		return;
	}
	register int mid = (l + r) >> 1;
	build(k << 1, l, mid);
	build(k << 1 | 1, mid + 1, r);
	push_up(k);
	return;
}
void modify(int k, int l, int r, int p, ll v)
{
	if(l == r)
	{
		minx[k] += v;
		return; 
	}
	register int mid = (l + r) >> 1;
	if(p <= mid) modify(k << 1, l, mid, p, v);
	else modify(k << 1 | 1, mid + 1, r, p, v);
	push_up(k);
	return;
}
ll query(int k, int l, int r, int x, int y)
{
	if(x <= l && r <= y) 
		return minx[k];
	ll ans = 1ll << 60;
	int mid = (l + r) >> 1;
	if(x <= mid) ans = min(ans, query(k << 1, 1, mid, x, y));
	if(mid < y)  ans = min(ans, query(k << 1 | 1, mid + 1, r, x, y));
	return ans;
}
int main()
{
	ios::sync_with_stdio(0);
	
	cin >> n >> m;
	for(int i = 1; i <= n; i++)
		cin >> a[i];
	build(1, 1, n);
	for(int i = 1; i <= m; i++)
	{
		int opt, l, r, v;
		cin >> opt;
		if(opt == 1)
		{
			cin >> l >> r >> v;
			modify(1, 1, n, l, v);
			modify(1, 1, n, r + 1, -v);
			//差分 
		}
		else
		{
			cin >> l >> r;
			if(query(1, 1, n, l + 1, r) >= 0)
				cout << "Yes" << endl;
			else 
				cout << "No" << endl;
		}
	}
	return 0;
}
2023/1/28 19:50
加载中...