36分TLE求助
查看原帖
36分TLE求助
777809
IOI_AK_TLR楼主2023/7/12 13:38

前两个点和最后一个点过了:

#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
int st[N][22], MyPow[22] = {1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, 32768, 65536, 131072, 262144, 524288, 1048576, 2097152};
int MyMax(int a, int b) {
	return a > b ? a : b;
}
int MyLog(int a) {
	int ans = 0;
	while (a)
		a >>= 1;
	return ans;
}
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 * 10 + ch - 48;
		ch = getchar();
	}
	return x * f;
}
inline void write(int x)
{
	if(x<0)putchar('-'),x=-x;
	if(x>9)write(x/10);
	putchar(x%10+'0');
}
int main() {
	int n, m;
	n = read();
	m = read();
	for (int i = 1; i <= n; i++)
		st[i][0] = read();
	for (int j = 1; j < 22; j++) {
		for (int i = 1; i < N; i++) {
			if (i + MyPow[j - 1] <= n) {
				st[i][j] = MyMax(st[i][j - 1], st[i + MyPow[j - 1]][j - 1]);
			} else {
				st[i][j] = st[i][j - 1];
			}
		}
	}
	for (int i = 1; i <= m; i++) {
		int l, r, M = -N, p;
		l = read();
		r = read();
		while (l <= r) {
//			cout<<st[l][(int)log2(r - l + 1)]<<"\n";
			p = st[l][MyLog(r - l + 1)];
			if (p > M)
				M = p;
			if (l < r)
				l += MyLog(r - l + 1) + 1;
			else
				l = r + 1;
		}
		write(M);
		putchar('\n');
	}
	return 0;
}
2023/7/12 13:38
加载中...