31分求助
查看原帖
31分求助
224558
JackMerryYoung楼主2021/12/11 12:47

Rt,本人十分正经地写完,交上去获得了 1~31 分的好成绩。

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

int N, K;
bool senpai[4000005];
long long arr[1000005], lnode[4000005], rnode[4000005], lazy[4000005];

void merge(int p);
void push(int p);
void build(int l, int r, int p);
void modify(int l, int r, int now_l, int now_r, int x, int p);
bool getans(int l, int r, int now_l, int now_r, int p);

int main()
{
	cin >> N >> K;
	for(int i = 1; i <= N; ++ i) cin >> arr[i];
	build(1, N, 1);

	for(int i = 1; i <= K; ++ i)
	{
		int opr, l, r, x;
		cin >> opr >> l >> r;
		if(opr == 1)
		{
			cin >> x;
			modify(l, r, 1, N, x, 1);
		}
		else 
		{
			bool flag = getans(l, r, 1, N, 1);
			if(flag) cout << "Yes\n";
			else 	 cout << "No\n";
		}
	}
	return 0;
}

void merge(int p)
{
	lnode[p] = lnode[p << 1];
	rnode[p] = rnode[(p << 1) | 1];
	if(senpai[p << 1] && senpai[(p << 1) | 1] && rnode[p << 1] <= lnode[(p << 1) | 1])
		senpai[p] = true;
	else
		senpai[p] = false;
}

void push(int p)
{
	lnode[p << 1] += lazy[p];
	rnode[p << 1] += lazy[p];
	lazy[p << 1] += lazy[p];
	lnode[(p << 1) | 1] += lazy[p];
	rnode[(p << 1) | 1] += lazy[p];
	lazy[(p << 1) | 1] += lazy[p];
	lazy[p] = 0;
}

void build(int l, int r, int p)
{
	if(l == r)
	{
		senpai[p] = true;
		lnode[p] = rnode[p] = arr[l];
		return;
	}

	int mid = (l + r) >> 1;
	build(l, mid, p << 1);
	build(mid + 1, r, (p << 1) | 1);
	merge(p);
}

void modify(int l, int r, int now_l, int now_r, int x, int p)
{
	if(l <= now_l && r >= now_r)
	{
		lnode[p] += x;
		rnode[p] += x;
		lazy[p] += x;
		return;
	}

	push(p);
	int mid = (now_l + now_r) >> 1;
	if(l <= mid) 	 modify(l, r, now_l, mid, x, p << 1);
	if(r >= mid + 1) modify(l, r, mid + 1, now_r, x, (p << 1) | 1);
	merge(p);
}

bool getans(int l, int r, int now_l, int now_r, int p)
{
	if(l <= now_l && r >= now_r)
		return senpai[p];

	push(p);
	int mid = (now_l + now_r) >> 1;
	if(r <= mid) 	 return getans(l, r, now_l, mid, p << 1);
	if(l >= mid + 1) return getans(l, r, mid + 1, now_r, (p << 1) | 1);
	senpai[p << 1] = getans(l, r, now_l, mid, p << 1);
	senpai[(p << 1) | 1] = getans(l, r, mid + 1, now_r, (p << 1) | 1);
	if(senpai[p << 1] && senpai[(p << 1) | 1] && rnode[p << 1] <= lnode[(p << 1) | 1])
		senpai[p] = true;
	else
		senpai[p] = false;
		
	return senpai[p];
}

我的思路跟题解区大佬一毛一样,但是出现了奇怪错误。

记录传送门

2021/12/11 12:47
加载中...