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];
}
我的思路跟题解区大佬一毛一样,但是出现了奇怪错误。