题目信息

题目类型
提高级
题目年份
2021
题目题型
综合题
关 键 词
RMQ区间最值问题

题目题干

20(RMQ 区间最值问题)给定序列 a0, … , an-1,和 m 次询问,每次询问给定 l, r,求max {al, … , ar} 。

为了解决该问题,有一个算法叫 the Method of Four Russians,其时间复杂度为0(n + m),步骤如下:X87100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

• 建立 Cartesian(笛卡尔)树,将问题转化为树上的 LCA(最近公共祖先)问题。X87100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

• 对于 LCA 问题,可以考虑其 Euler 序(即按照 DFS 过程,经过所有点,环游回根的序列),即求 Euler 序列上两点间一个新的 RMQ 问题。X87100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

• 注意新的问题为 ±1 RMQ,即相邻两点的深度差一定为 1。X87100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

下面解决这个 ±1 RMQ 问题,“序列”指 Euler 序列:X87100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

• 设 t 为 Euler 序列长度。取 b =20(RMQ 区间最值问题)给定序列 a0, … , an-1,和 m 次询问,每次询问给定 l, r,求max {al, … , ar} 。 为了解决该问题,有一个算法叫 the Method of Four Russians,其时间复杂度为0(n + m),步骤如下:  • 建立 Cartesian(笛卡尔)树,将问题转化为树上的 LCA(最近公共祖先)问题。  • 对于 LCA 问题,可以考虑其 Euler 序(即按照 DFS 过程,经过所有点,环游回根的序列),即求 Euler 序列上两点间一个新的 RMQ 问题。  • 注意新的问题为 ±1 RMQ,即相邻两点的深度差一定为 1。  下面解决这个 ±1 RMQ 问题,“序列”指 Euler 序列:  • 设 t 为 Euler 序列长度。取 b =将序列每 b 个分为一大块, 使用 ST 表(倍增表)处理大块间的 RMQ 问题,复杂度    • (重点)对于一个块内的 RMQ 问题,也需要O(1) 的算法。由于差分数组 2b-1  种,可以预处理出所有情况下的最值位置,预处理复杂度 O(b2b),不超过 O(n)。  • 最终,对于一个查询,可以转化为中间整的大块的 RMQ 问题,以及两端块内的 RMQ 问题。  试补全程序。  #include <iostream>  #include <cmath>  using namespace std;  const int MAXN = 100000, MAXT = MAXN << 1;  const int MAXL = 18, MAXB = 9, MAXC = MAXT / MAXB;  struct node {  int val;  int dep, dfn, end;  node *son[2]; // son[0], son[1] 分别表示左右儿子  } T[MAXN];  int n, t, b, c, Log2[MAXC + 1];  int Pos[(1 << (MAXB - 1)) + 5], Dif[MAXC + 1];  node *root, *A[MAXT], *Min[MAXL][MAXC];  void build() { // 建立 Cartesian 树  static node *S[MAXN + 1];  int top = 0;  for (int i = 0; i < n; i++) {  node *p = &T[i];  while (top && S[top]->val < p->val)  ①;  if (top)  ②;  S[++top] = p;  }  root = S[1];  }  void DFS(node *p) { // 构建 Euler 序列  A[p->dfn = t++] = p;  for (int i = 0; i < 2; i++)  if (p->son[i]) {  p->son[i]->dep = p->dep + 1;  DFS(p->son[i]);  A[t++] = p;  }  p->end = t - 1;  }  node *min(node *x, node *y) {  return ③ ? x : y;  }  void ST_init() {  b = (int)(ceil(log2(t) / 2));  c = t / b;  Log2[1] = 0;  for (int i = 2; i <= c; i++)  Log2[i] = Log2[i >> 1] + 1;  for (int i = 0; i < c; i++) {  Min[0][i] = A[i * b];  for (int j = 1; j < b; j++)  Min[0][i] = min(Min[0][i], A[i * b + j]);  }  for (int i = 1, l = 2; l <= c; i++, l <<= 1)  for (int j = 0; j + l <= c; j++)  Min[i][j] = min(Min[i - 1][j], Min[i - 1][j + (l >> 1)]);  }  void small_init() { // 块内预处理  for (int i = 0; i <= c; i++)  for (int j = 1; j < b && i * b + j < t; j++)  if (④)  Dif[i] |= 1 << (j - 1);  for (int S = 0; S < (1 << (b - 1)); S++) {  int mx = 0, v = 0;  for (int i = 1; i < b; i++) {  ⑤;  if (v < mx) {  mx = v;  Pos[S] = i;  }  }  }  }  node *ST_query(int l, int r) {  int g = Log2[r - l + 1];  return min(Min[g][l], Min[g][r - (1 << g) + 1]);  }  node *small_query(int l, int r) { // 块内查询  int p = l / b;  int S = ⑥;  return A[l + Pos[S]];  }  node *query(int l, int r) {  if (l > r)  return query(r, l);  int pl = l / b, pr = r / b;  if (pl == pr) {  return small_query(l, r);  } else {  node *s = min(small_query(l, pl * b + b - 1),                                                           small_query(pr * b, r));  if (pl + 1 <= pr - 1)  s = min(s, ST_query(pl + 1, pr - 1));  return s;  }  }  int main() {  int m;  cin >> n >> m;  for (int i = 0; i < n; i++)  cin >> T[i].val;  build();  DFS(root);  ST_init();  small_init();  while (m--) {  int l, r;  cin >> l >> r;  cout << query(T[l].dfn, T[r].dfn)->val << endl;  }  return 0;  }   单选 ①处应填( )  A.p->son[0] = S[top--] B.p->son[1] = S[top--] C.S[top--]->son[0] = p D.S[top--]->son[1] = p  第2题 单选 ②处应填( )  A.p->son[0] = S[top] B.p->son[1] = S[top] C.S[top]->son[0] = p D.S[top]->son[1] = p  第3题 单选 ③处应填( )  A.x->dep < y->dep B.x < y C.x->dep > y->dep D.x->val < y->val  第4题 单选 ④处应填( )  A.A[i * b + j - 1] == A[i * b + j]->son[0] B.A[i * b + j]->val < A[i * b + j - 1]->val C.A[i * b + j] == A[i * b + j - 1]->son[1] D.A[i * b + j]->dep < A[i * b + j - 1]->dep  第5题 单选 ⑤处应填( )  A.v += (S >> i & 1) ? -1 : 1 B.v += (S >> i & 1) ? 1 : -1 C.v += (S >> (i - 1) & 1) ? 1 : -1 D.v += (S >> (i - 1) & 1) ? -1 : 1  第6题 单选 ⑥处应填( )  A.(Dif[p] >> (r - p * b)) & ((1 << (r - l)) - 1) B.Dif[p] C.(Dif[p] >> (l - p * b)) & ((1 << (r - l)) - 1) D.(Dif[p] >> ((p + 1) * b - r)) & ((1 << (r - l + 1)) - 1)将序列每 b 个分为一大块, 使用 ST 表(倍增表)处理大块间的 RMQ 问题,复杂度X87100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

20(RMQ 区间最值问题)给定序列 a0, … , an-1,和 m 次询问,每次询问给定 l, r,求max {al, … , ar} 。 为了解决该问题,有一个算法叫 the Method of Four Russians,其时间复杂度为0(n + m),步骤如下:  • 建立 Cartesian(笛卡尔)树,将问题转化为树上的 LCA(最近公共祖先)问题。  • 对于 LCA 问题,可以考虑其 Euler 序(即按照 DFS 过程,经过所有点,环游回根的序列),即求 Euler 序列上两点间一个新的 RMQ 问题。  • 注意新的问题为 ±1 RMQ,即相邻两点的深度差一定为 1。  下面解决这个 ±1 RMQ 问题,“序列”指 Euler 序列:  • 设 t 为 Euler 序列长度。取 b =将序列每 b 个分为一大块, 使用 ST 表(倍增表)处理大块间的 RMQ 问题,复杂度    • (重点)对于一个块内的 RMQ 问题,也需要O(1) 的算法。由于差分数组 2b-1  种,可以预处理出所有情况下的最值位置,预处理复杂度 O(b2b),不超过 O(n)。  • 最终,对于一个查询,可以转化为中间整的大块的 RMQ 问题,以及两端块内的 RMQ 问题。  试补全程序。  #include <iostream>  #include <cmath>  using namespace std;  const int MAXN = 100000, MAXT = MAXN << 1;  const int MAXL = 18, MAXB = 9, MAXC = MAXT / MAXB;  struct node {  int val;  int dep, dfn, end;  node *son[2]; // son[0], son[1] 分别表示左右儿子  } T[MAXN];  int n, t, b, c, Log2[MAXC + 1];  int Pos[(1 << (MAXB - 1)) + 5], Dif[MAXC + 1];  node *root, *A[MAXT], *Min[MAXL][MAXC];  void build() { // 建立 Cartesian 树  static node *S[MAXN + 1];  int top = 0;  for (int i = 0; i < n; i++) {  node *p = &T[i];  while (top && S[top]->val < p->val)  ①;  if (top)  ②;  S[++top] = p;  }  root = S[1];  }  void DFS(node *p) { // 构建 Euler 序列  A[p->dfn = t++] = p;  for (int i = 0; i < 2; i++)  if (p->son[i]) {  p->son[i]->dep = p->dep + 1;  DFS(p->son[i]);  A[t++] = p;  }  p->end = t - 1;  }  node *min(node *x, node *y) {  return ③ ? x : y;  }  void ST_init() {  b = (int)(ceil(log2(t) / 2));  c = t / b;  Log2[1] = 0;  for (int i = 2; i <= c; i++)  Log2[i] = Log2[i >> 1] + 1;  for (int i = 0; i < c; i++) {  Min[0][i] = A[i * b];  for (int j = 1; j < b; j++)  Min[0][i] = min(Min[0][i], A[i * b + j]);  }  for (int i = 1, l = 2; l <= c; i++, l <<= 1)  for (int j = 0; j + l <= c; j++)  Min[i][j] = min(Min[i - 1][j], Min[i - 1][j + (l >> 1)]);  }  void small_init() { // 块内预处理  for (int i = 0; i <= c; i++)  for (int j = 1; j < b && i * b + j < t; j++)  if (④)  Dif[i] |= 1 << (j - 1);  for (int S = 0; S < (1 << (b - 1)); S++) {  int mx = 0, v = 0;  for (int i = 1; i < b; i++) {  ⑤;  if (v < mx) {  mx = v;  Pos[S] = i;  }  }  }  }  node *ST_query(int l, int r) {  int g = Log2[r - l + 1];  return min(Min[g][l], Min[g][r - (1 << g) + 1]);  }  node *small_query(int l, int r) { // 块内查询  int p = l / b;  int S = ⑥;  return A[l + Pos[S]];  }  node *query(int l, int r) {  if (l > r)  return query(r, l);  int pl = l / b, pr = r / b;  if (pl == pr) {  return small_query(l, r);  } else {  node *s = min(small_query(l, pl * b + b - 1),                                                           small_query(pr * b, r));  if (pl + 1 <= pr - 1)  s = min(s, ST_query(pl + 1, pr - 1));  return s;  }  }  int main() {  int m;  cin >> n >> m;  for (int i = 0; i < n; i++)  cin >> T[i].val;  build();  DFS(root);  ST_init();  small_init();  while (m--) {  int l, r;  cin >> l >> r;  cout << query(T[l].dfn, T[r].dfn)->val << endl;  }  return 0;  }   单选 ①处应填( )  A.p->son[0] = S[top--] B.p->son[1] = S[top--] C.S[top--]->son[0] = p D.S[top--]->son[1] = p  第2题 单选 ②处应填( )  A.p->son[0] = S[top] B.p->son[1] = S[top] C.S[top]->son[0] = p D.S[top]->son[1] = p  第3题 单选 ③处应填( )  A.x->dep < y->dep B.x < y C.x->dep > y->dep D.x->val < y->val  第4题 单选 ④处应填( )  A.A[i * b + j - 1] == A[i * b + j]->son[0] B.A[i * b + j]->val < A[i * b + j - 1]->val C.A[i * b + j] == A[i * b + j - 1]->son[1] D.A[i * b + j]->dep < A[i * b + j - 1]->dep  第5题 单选 ⑤处应填( )  A.v += (S >> i & 1) ? -1 : 1 B.v += (S >> i & 1) ? 1 : -1 C.v += (S >> (i - 1) & 1) ? 1 : -1 D.v += (S >> (i - 1) & 1) ? -1 : 1  第6题 单选 ⑥处应填( )  A.(Dif[p] >> (r - p * b)) & ((1 << (r - l)) - 1) B.Dif[p] C.(Dif[p] >> (l - p * b)) & ((1 << (r - l)) - 1) D.(Dif[p] >> ((p + 1) * b - r)) & ((1 << (r - l + 1)) - 1)X87100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

• (重点)对于一个块内的 RMQ 问题,也需要O(1) 的算法。由于差分数组 2b-1X87100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

种,可以预处理出所有情况下的最值位置,预处理复杂度 O(b2b),不超过 O(n)。X87100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

• 最终,对于一个查询,可以转化为中间整的大块的 RMQ 问题,以及两端块内的 RMQ 问题。X87100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

试补全程序。X87100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

#include <iostream>X87100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

#include <cmath>X87100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

using namespace std;X87100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

const int MAXN = 100000, MAXT = MAXN << 1;X87100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

const int MAXL = 18, MAXB = 9, MAXC = MAXT / MAXB;X87100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

struct node {X87100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

int val;X87100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

int dep, dfn, end;X87100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

node *son[2]; // son[0], son[1] 分别表示左右儿子X87100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

} T[MAXN];X87100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

int n, t, b, c, Log2[MAXC + 1];X87100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

int Pos[(1 << (MAXB - 1)) + 5], Dif[MAXC + 1];X87100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

node *root, *A[MAXT], *Min[MAXL][MAXC];X87100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

void build() { // 建立 Cartesian 树X87100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

static node *S[MAXN + 1];X87100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

int top = 0;X87100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

for (int i = 0; i < n; i++) {X87100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

node *p = &T[i];X87100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

while (top && S[top]->val < p->val)X87100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

①;X87100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

if (top)X87100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

②;X87100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

S[++top] = p;X87100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

}X87100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

root = S[1];X87100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

}X87100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

void DFS(node *p) { // 构建 Euler 序列X87100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

A[p->dfn = t++] = p;X87100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

for (int i = 0; i < 2; i++)X87100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

if (p->son[i]) {X87100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

p->son[i]->dep = p->dep + 1;X87100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

DFS(p->son[i]);X87100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

A[t++] = p;X87100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

}X87100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

p->end = t - 1;X87100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

}X87100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

node *min(node *x, node *y) {X87100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

return ③ ? x : y;X87100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

}X87100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

void ST_init() {X87100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

b = (int)(ceil(log2(t) / 2));X87100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

c = t / b;X87100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

Log2[1] = 0;X87100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

for (int i = 2; i <= c; i++)X87100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

Log2[i] = Log2[i >> 1] + 1;X87100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

for (int i = 0; i < c; i++) {X87100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

Min[0][i] = A[i * b];X87100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

for (int j = 1; j < b; j++)X87100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

Min[0][i] = min(Min[0][i], A[i * b + j]);X87100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

}X87100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

for (int i = 1, l = 2; l <= c; i++, l <<= 1)X87100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

for (int j = 0; j + l <= c; j++)X87100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

Min[i][j] = min(Min[i - 1][j], Min[i - 1][j + (l >> 1)]);X87100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

}X87100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

void small_init() { // 块内预处理X87100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

for (int i = 0; i <= c; i++)X87100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

for (int j = 1; j < b && i * b + j < t; j++)X87100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

if (④)X87100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

Dif[i] |= 1 << (j - 1);X87100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

for (int S = 0; S < (1 << (b - 1)); S++) {X87100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

int mx = 0, v = 0;X87100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

for (int i = 1; i < b; i++) {X87100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

⑤;X87100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

if (v < mx) {X87100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

mx = v;X87100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

Pos[S] = i;X87100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

}X87100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

}X87100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

}X87100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

}X87100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

node *ST_query(int l, int r) {X87100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

int g = Log2[r - l + 1];X87100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

return min(Min[g][l], Min[g][r - (1 << g) + 1]);X87100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

}X87100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

node *small_query(int l, int r) { // 块内查询X87100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

int p = l / b;X87100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

int S = ⑥;X87100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

return A[l + Pos[S]];X87100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

}X87100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

node *query(int l, int r) {X87100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

if (l > r)X87100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

return query(r, l);X87100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

int pl = l / b, pr = r / b;X87100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

if (pl == pr) {X87100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

return small_query(l, r);X87100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

} else {X87100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

node *s = min(small_query(l, pl * b + b - 1), X87100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

                                                        small_query(pr * b, r));X87100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

if (pl + 1 <= pr - 1)X87100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

s = min(s, ST_query(pl + 1, pr - 1));X87100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

return s;X87100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

}X87100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

}X87100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

int main() {X87100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

int m;X87100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

cin >> n >> m;X87100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

for (int i = 0; i < n; i++)X87100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

cin >> T[i].val;X87100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

build();X87100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

DFS(root);X87100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

ST_init();X87100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

small_init();X87100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

while (m--) {X87100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

int l, r;X87100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

cin >> l >> r;X87100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

cout << query(T[l].dfn, T[r].dfn)->val << endl;X87100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

}X87100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

return 0;X87100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

}X87100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

 单选

①处应填( )X87100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

A.p->son[0] = S[top--]
B.p->son[1] = S[top--]
C.S[top--]->son[0] = p
D.S[top--]->son[1] = p
 
第2题 单选

②处应填( )X87100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

A.p->son[0] = S[top]
B.p->son[1] = S[top]
C.S[top]->son[0] = p
D.S[top]->son[1] = p
 
第3题 单选

③处应填( )X87100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

A.x->dep < y->dep
B.x < y
C.x->dep > y->dep
D.x->val < y->val
 
第4题 单选

④处应填( )X87100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

A.A[i * b + j - 1] == A[i * b + j]->son[0]
B.A[i * b + j]->val < A[i * b + j - 1]->val
C.A[i * b + j] == A[i * b + j - 1]->son[1]
D.A[i * b + j]->dep < A[i * b + j - 1]->dep
 
第5题 单选

⑤处应填( )X87100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

A.v += (S >> i & 1) ? -1 : 1
B.v += (S >> i & 1) ? 1 : -1
C.v += (S >> (i - 1) & 1) ? 1 : -1
D.v += (S >> (i - 1) & 1) ? -1 : 1
 
第6题 单选

⑥处应填( )X87100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

A.(Dif[p] >> (r - p * b)) & ((1 << (r - l)) - 1)
B.Dif[p]
C.(Dif[p] >> (l - p * b)) & ((1 << (r - l)) - 1)
D.(Dif[p] >> ((p + 1) * b - r)) & ((1 << (r - l + 1)) - 1)
 

答案解析

相关题目

20(RMQ 区间最值问题)给定序列 a0, … , an-1,和 m 次询问,每次询问给定 l, r,求max {al, … , ar} 。 为了解决该问题,有一个算法叫 the Method of
第19 (分数背包)小S有n块蛋糕,编号从1到n第i块蛋糕的价值是wi, 体积是vi。他有一个大小为B的盒子来装这些蛋糕,也就是说装入盒子的 蛋糕的体积总和不能超过B。 他打算选择一些蛋糕装入盒子,
第18 题 #include <iostream>    #include <string>    using namespace std;        char base[
第17 题 #include <algorithm>    #include <iostream>    using namespace std;        int n, 
第 16 #include <iostream>    #include <cmath>    using namespace std;        const double
第 15 题 有如下的有向图,节点为 A, B, … , J, 其中每条边的长度都标在图中。则节点 A 到节点 J 的最短路径长度为( )。 A.16 B.19 C.20 D.22
第 14 题 设一个三位数a, b, c 均为 1~9 之间的整数,若以 a、 b、 c 作为三角形的三条边可以构成等腰三角形(包括等边),则这样的 n 有( )个。 A.81 B.120 C.16
第 13 题 有 88 个苹果从左到右排成一排,你要从中挑选至少一个苹果,并且不能同时挑选相邻的两个苹果,一共有( )种方案。  A. 36  B. 48  C. 54  D. 64
第 12 题 斐波那契数列的定义为:F1=1,F2=1,Fn=Fn-1+Fn-2 (n>=3)。现在用如下程序来计算斐波那契数列的第 n 项,其时间复杂度为( )。 F(n): if n&l
第 11 题 有如下递归代码 solve(t, n):    if t=1 return 1    else return 5*solve(t-1,n) mod n  则 solve(23,23)

提示声明

  • 免责声明:本站资源均来自网络或者用户投稿,仅供用于学习和交流:如有侵权联系删除!
  • 温馨提示:本文属于积分文章,需要充值获得积分或升级VIP会员,也可在会员中心投稿获取。

猜你喜欢