- 数列区间最大值
TJ
- 2024-1-31 14:09:55 @
block:
/* created by chjshen, date: 2024-01-31 13:54 */
#include <cmath>
#include <cstdio>
#include <iostream>
using namespace std;
#define int long long
const int N = 1e5 + 5;
int n, m, a[N], mx[N], L[N], R[N], pos[N];
int bl, bn; // block len , block num
void handle(void)
{
int x, y;
int ans = -1e18;
scanf("%lld%lld", &x, &y);
int lb = pos[x], rb = pos[y];
if (lb == rb)
{
// force it
for (int i = x; i <= y; i++) ans = max(ans, a[i]);
}
else
{
// 1. 搞前面那个块, force it
for (int i = x; i <= R[lb]; i++) ans = max(ans, a[i]);
// 2. 搞完整的那些块
for (int i = lb + 1; i <= rb - 1; i++) ans = max(ans, mx[i]);
// 3.搞后面的那个块,force it
for (int i = L[rb]; i <= y; i++) ans = max(ans, a[i]);
}
printf("%lld\n", ans);
}
void initInput(void)
{
scanf("%lld%lld", &n, &m);
for (int i = 1; i <= n; i++)
{
scanf("%lld", &a[i]);
mx[i] = -1E18;
}
// block init
bl = sqrt(n);
bn = n / bl;
for (int i = 1; i <= bn; i++)
{
L[i] = (i - 1) * bl + 1;
R[i] = i * bl;
for (int j = L[i]; j <= R[i]; j++)
{
mx[i] = max(mx[i], a[j]);
pos[j] = i;
}
}
if (n > bl * bn)
{
bn++;
L[bn] = (bn - 1) * bl + 1;
R[bn] = n;
for (int j = L[bn]; j <= R[bn]; j++) mx[bn] = max(mx[bn], a[j]), pos[j] = bn;
}
while (m--) handle();
}
signed main(void)
{
initInput();
return 0;
}
3 条评论
-
张嘉源 LV 10 MOD @ 2024-1-31 14:27:46
%%%%
-
2024-1-31 14:10:24@
st table:
/* created by chjshen, date: 2024-01-31 13:22 */ #include <cstdio> #include <iostream> using namespace std; #define int long long const int N = 1E5 + 5; const int INF = 1E18; int n, m, a[N], f[N][30]; int mlg[N]; void handle(void) { int L, R; scanf("%lld%lld", &L, &R); int len = R - L + 1; int ans = max(f[L][mlg[len]], f[R - (1 << mlg[len]) + 1][mlg[len]]); printf("%lld\n", ans); } void initInput(void) { scanf("%lld%lld", &n, &m); for (int i = 1; i <= n; i++) { scanf("%lld", &a[i]); f[i][0] = a[i]; } mlg[1] = 0; for (int i = 2; i < N; i++) mlg[i] = mlg[i / 2] + 1; for (int j = 1; j <= 20; j++) { for (int i = 1; i <= n - (1 << j) + 1; i++) { f[i][j] = max(f[i][j - 1], f[i + (1 << (j - 1))][j - 1]); } } while (m--) handle(); } signed main(void) { initInput(); return 0; }
-
2024-1-31 14:10:13@
qp
- 1
信息
- ID
- 1720
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 9
- 标签
- 递交数
- 483
- 已通过
- 46
- 上传者