蒟蒻求助,RMQ 死循环
  • 板块学术版
  • 楼主johnCh
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/7/13 09:12
  • 上次更新2024/7/13 09:15:20
查看原帖
蒟蒻求助,RMQ 死循环
1366636
johnCh楼主2024/7/13 09:12

站外题目,RMQ

题目:【RMQ】数列区间最大值【模板题】

题目描述
  输入一串数字,给你M个询问,每次询问就给你两个数字 X,Y要求你说出 X到Y 这段区间内的最大数。
输入输出格式
输入格式:
  第一行两个整数N,M 表示数字的个数和要询问的次数;
  接下来一行为N 个数;
  接下来M 行,每行都有两个整数X,Y 。
输出格式:
  输出共m行,每行输出一个数。

这个代码死循环,求助

#include<iostream>
#include<cmath>
#include<algorithm>
#ifndef ONLINE_JUDGE		// 洛谷判断
	#pragma GCC optimize(2)	// 火车头 (O2)
#endif
using namespace std;
const int N = 1e5 + 5;
int st[N][30], a[N], lg[N], n, m;
void preLg()	// 预处理 ∑{ i = 1, i <= n : log2(i) }
{
	lg[1] = 0;
	for ( int i = 2; i <= n; i++ ) { lg[i] = lg[i / 2] + 1; }
}
void preST()	// 初始化 ST 表
{
	for ( int i = 1; i <= n; i++ ) { st[i][0] = a[i]; }
	for ( int j = 1; j <= ( int ) lg[n]; j++ ) for ( int i = 1; i <= n; i++ ) { st[i][j] = max ( st[i][j - 1], st[i + ( 1 << ( j - 1 ) )][j - 1] ); }
}
int query ( int x, int y )
{
	int len = lg[y - x + 1];
	return st[x][len - 1] + st[y - ( 1 << ( len - 1 ) )][len - 1];
}
int main()
{
	preLg();
	cin >> n >> m;
	for ( int i = 1; i <= n; i++ ) { cin >> a[i]; }
	preST();
	for ( int x, y, i = 0; i < m; i++ )
	{
		cout << query ( x, y ) << endl;
	}
	return 0;
}

Thanks

2024/7/13 09:12
加载中...