WA on #2
查看原帖
WA on #2
119533
noctua楼主2022/8/11 13:57

plz help

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

const long long MAXN = 2e5 + 5;
const long long INF = 0x3f3f3f3f;

long long n;
long long a[MAXN];

long long lbound[MAXN];
long long rbound[MAXN];
long long prefix[MAXN];
long long st1[MAXN][25];
long long st2[MAXN][25];
long long st3[MAXN][25];

stack <long long> stk1;
stack <long long> stk2;

void initst() {
	for (long long i = 1; i <= n; i++) {
		st1[i][0] = prefix[i];
		st2[i][0] = prefix[i];
		st3[i][0] = a[i];
	}

	for(long long j = 1; j <= 20; j++) {
		for (long long i = 1; i + (1 << j) - 1 <= n; i++) {
			st1[i][j] = max(st1[i][j - 1], st1[i + (1 << (j - 1))][j - 1]);
			st2[i][j] = min(st2[i][j - 1], st2[i + (1 << (j - 1))][j - 1]);
			st3[i][j] = max(st3[i][j - 1], st3[i + (1 << (j - 1))][j - 1]);
		}
	}
}

void initinterval() {

	for (long long i = 1; i <= n; i++) {
		lbound[i] = 0;
		rbound[i] = n + 1;	
	}
	for (long long i = 1; i <= n; i++) {
		while (!stk1.empty() && a[i] > a[stk1.top()]) {
			rbound[stk1.top()] = i;
			stk1.pop();
		}
		stk1.push(i);
	}

	for (long long i = n; i >= 1; i--) {
		while (!stk2.empty() && a[i] > a[stk2.top()]) {
			lbound[stk2.top()] = i;
			stk2.pop();
		}
		stk2.push(i);
	}

	
}


long long querymax(long long l, long long r) {
	long long k = log2(r - l + 1);
	return max(st1[l][k], st1[r - (1 << k) + 1][k]);
}

long long querymin(long long l, long long r) {
	long long k = log2(r - l + 1);
	return min(st2[l][k], st2[r - (1 << k) + 1][k]);
}

long long query(long long l, long long r) {
	long long k = log2(r - l + 1);
	return max(st3[l][k], st3[r - (1 << k) + 1][k]);
}



int main() {
	long long t;
	cin >> t;
	
	while (t--) {
		cin >> n;

		memset(st1, 0, sizeof(st1));
		memset(st2, 0, sizeof(st2));
		memset(a, 0, sizeof(a));
		memset(prefix, 0, sizeof(prefix));
		
		while (!stk1.empty()) {
			stk1.pop();
		}

		while (!stk2.empty()) {
			stk2.pop();
		}
		
		for (long long i = 1; i <= n; i++) {
			cin >> a[i];
			prefix[i] = a[i] + prefix[i - 1];
			//cout << prefix[i] << " ";
		}
		//cout << endl;

		initinterval();
		initst();

		bool ok = true;
		for (long long i = 1; i <= n; i++) {
			long long leftsum = querymin(lbound[i], i - 1);
			//cout << "lsum: " << lbound[i] << " " << i - 1 << " " << leftsum << endl;
			long long rightsum = querymax(i, rbound[i] - 1);
			//cout << "rsum: " << i << " " << rbound[i] << " " << rightsum << endl;
			//cout << "a[i]: " << a[i] << endl;
			//long long maxnum = query(lbound[i], rbound[i]);
			long long summax = rightsum - leftsum;
			if (a[i] < summax) {
				ok = false;
				break;
			}
		}

		if (!ok) {
			cout << "NO" << endl;
		}
		else {
			cout << "YES" << endl;
		}

	}
	return 0;
}
2022/8/11 13:57
加载中...