WA 10pts 求助
查看原帖
WA 10pts 求助
737621
_Lazy_whr_楼主2024/11/1 21:31

思路:STST

但是好像就第一个点过了……

好球没打 STST 表了 qwq 都蒻成这样了

#include<bits/stdc++.h>
#define int long long
// #pragma GCC target("avx")
// #pragma GCC optimize(3,"Ofast","inline")
namespace FastIO {
	inline int read () {
		int x = 0, f = 1;
		char ch = getchar ();
		while (ch < '0' || ch > '9') {
			if (ch == '-')
				f = -1;
			ch = getchar ();
		}
		while (ch >= '0' && ch <= '9') {
			x = (x << 1) + (x << 3) + (ch ^ 48);
			ch = getchar ();
		}
		return x * f;
	}

	template<typename T> inline void read (T &x) {
		x = read ();
		return;
	}

	template<typename T,typename... Args> inline void read (T &x,Args &...x_) {
		read (x);
		read (x_...);
		return;
	}
}

namespace Constants {
	const int INF = 1e18;
	const int DIR[4][2] = {{1, 0}, {0, 1}, {-1, 0}, {0, -1}};
	const double EPS = 1e-7;
	const double PI = 3.14159265358979323;
}

using namespace std;
using namespace FastIO;
using namespace Constants;

inline void CLOSE () {
	ios::sync_with_stdio (false);
	cin.tie (nullptr);
	cout.tie (nullptr);
	return;
}

const int N = 5e4 + 10;

int n, m;
int a[N], Log[N];
int dp[N][20][2];

void Init_st () {
	Log[0] = -1;
	for (int i = 1; i <= n; i++) {
		Log[i] = Log[i >> 1] + 1;
		dp[i][0][0] = a[i];
		dp[i][0][1] = a[i];
	}

	for (int j = 1; j <= 16; j++) {
		for (int i = 1; i + (1 << j) - 1 <= n; i++) {
			dp[i][j][0] = min (dp[i][j - 1][0], dp[i + (1 << j) - 1][j - 1][0]);
			dp[i][j][1] = max (dp[i][j - 1][1], dp[i + (1 << j) - 1][j - 1][1]);
		}
	}
	return;
}

int Ask_min (int l, int r) {
	int k = Log[r - l + 1];
	return min (dp[l][k][0], dp[r - (1 << k) + 1][k][0]);
}

int Ask_max (int l, int r) {
	int k = Log[r - l + 1];
	return max (dp[l][k][1], dp[r - (1 << k) + 1][k][1]);
}

signed main() {
	CLOSE ();
	read (n, m);
	for (int i = 1; i <= n; i++) {
		read (a[i]);
	}
	Init_st ();

	while (m--) {
		int l = read (), r = read ();
		cout << Ask_max (l, r) - Ask_min (l, r) << endl;
	}
	return 0;
}
2024/11/1 21:31
加载中...