题目信息

题目类型
提高级
题目年份
2023
题目题型
综合题
关 键 词
最大值之和

题目题干

第 20 题

2.(最大值之和)给定整数序列 第 20 题 2.(最大值之和)给定整数序列 ,求该序列所有非空连续子序列的最大值之和。上述参数满足  。一个序列的非空连续子序列可以用两个下标 l和 r(其中 0≤l≤r<n)表示,对应的序列为​。两个非空连续子序列不同,当且仅当下标不同。 例如,当原序列为 [1,2,1,2]时,要计算子序列 [1]、[2]、[1]、[2]、[1,2]、[2,1]、[1,2]、[1,2,1]、[2,1,2]、[1,2,1,2] 的最大值之和,答案为 18。注意 [1,1]和 [2,2]虽然是原序列的子序列,但不是连续子序列,所以不应该被计算。另外,注意其中有一些值相同的子序列,但由于他们在原序列中的下标不同,属于不同的非空连续子序列,所以会被分别计算。  解决该问题有许多算法,以下程序使用分治算法,时间复杂度 试补全程序。   #include <iostream>  #include <algorithm>  #include <vector>    const int MAXN = 100000;    int n;  int a[MAXN];  long long ans;    void solve(int l, int r) {      if (l + 1 == r) {          ans += a[l];          return;      }      int mid = (l + r) >> 1;      std::vector<int> pre(a + mid, a + r);      for (int i = 1; i < r - mid; ++i) ①;      std::vector<long long> sum(r - mid + 1);      for (int i = 0; i < r - mid; ++i)          sum[i + 1] = sum[i] + pre[i];      for (int i = mid - l, j = mid, max = 0; i >= l; --i) {          while (j < r && ②) ++j;          max = std::max(max, a[i]);          ans += ③;          ans += ④;      }      solve(l, mid);      solve(mid, r);  }    int main() {      std::cin >> n;      for (int i = 0; i < n; ++i)          std::cin >> a[i];      ⑤;      std::cout << ans << std::endl;      return 0;  }   ①处应填()  ②处应填()  ③处应填()  ④处应填()  ⑤处应填() 1.  A.  pre[i] = std::max(pre[i - 1], a[i - 1])  B.  pre[i + 1] = std::max(pre[i],pre[i + 1])  C.  pre[i] = std::max(pre[i -1], a[i])  D.  pre[i] = std::max(pre[i], pre[i - 1]) 2.  A.  a[j] < max  B.  a[j] < a[i]  C.  pre[j - mid] < max  D.  pre[j - mid] > max 3.  A.  (long long)(j - mid) * max  B.  (long long)(j - mid) * (i - 1) * max  C.  sum[j - mid]  D.  sum[j - mid] * (i - 1) 4.  A.  (long long)(r - j) * max  B.  (long long)(r - j) * (mid - i) * max  C.  sum[r - mid] - sum[j - mid]  D.  (sum[r - mid] - sum[j - mid]) * (mid - i) 5.  A.  solve(0,n)  B.  solve(0,n - 1)  C.  solve(1,n)  D.  solve(1,n - 1),求该序列所有非空连续子序列的最大值之和。上述参数满足 第 20 题 2.(最大值之和)给定整数序列 ,求该序列所有非空连续子序列的最大值之和。上述参数满足  。一个序列的非空连续子序列可以用两个下标 l和 r(其中 0≤l≤r<n)表示,对应的序列为​。两个非空连续子序列不同,当且仅当下标不同。 例如,当原序列为 [1,2,1,2]时,要计算子序列 [1]、[2]、[1]、[2]、[1,2]、[2,1]、[1,2]、[1,2,1]、[2,1,2]、[1,2,1,2] 的最大值之和,答案为 18。注意 [1,1]和 [2,2]虽然是原序列的子序列,但不是连续子序列,所以不应该被计算。另外,注意其中有一些值相同的子序列,但由于他们在原序列中的下标不同,属于不同的非空连续子序列,所以会被分别计算。  解决该问题有许多算法,以下程序使用分治算法,时间复杂度 试补全程序。   #include <iostream>  #include <algorithm>  #include <vector>    const int MAXN = 100000;    int n;  int a[MAXN];  long long ans;    void solve(int l, int r) {      if (l + 1 == r) {          ans += a[l];          return;      }      int mid = (l + r) >> 1;      std::vector<int> pre(a + mid, a + r);      for (int i = 1; i < r - mid; ++i) ①;      std::vector<long long> sum(r - mid + 1);      for (int i = 0; i < r - mid; ++i)          sum[i + 1] = sum[i] + pre[i];      for (int i = mid - l, j = mid, max = 0; i >= l; --i) {          while (j < r && ②) ++j;          max = std::max(max, a[i]);          ans += ③;          ans += ④;      }      solve(l, mid);      solve(mid, r);  }    int main() {      std::cin >> n;      for (int i = 0; i < n; ++i)          std::cin >> a[i];      ⑤;      std::cout << ans << std::endl;      return 0;  }   ①处应填()  ②处应填()  ③处应填()  ④处应填()  ⑤处应填() 1.  A.  pre[i] = std::max(pre[i - 1], a[i - 1])  B.  pre[i + 1] = std::max(pre[i],pre[i + 1])  C.  pre[i] = std::max(pre[i -1], a[i])  D.  pre[i] = std::max(pre[i], pre[i - 1]) 2.  A.  a[j] < max  B.  a[j] < a[i]  C.  pre[j - mid] < max  D.  pre[j - mid] > max 3.  A.  (long long)(j - mid) * max  B.  (long long)(j - mid) * (i - 1) * max  C.  sum[j - mid]  D.  sum[j - mid] * (i - 1) 4.  A.  (long long)(r - j) * max  B.  (long long)(r - j) * (mid - i) * max  C.  sum[r - mid] - sum[j - mid]  D.  (sum[r - mid] - sum[j - mid]) * (mid - i) 5.  A.  solve(0,n)  B.  solve(0,n - 1)  C.  solve(1,n)  D.  solve(1,n - 1) 。一个序列的非空连续子序列可以用两个下标 l和 r(其中 0≤l≤r<n)表示,对应的序列为第 20 题 2.(最大值之和)给定整数序列 ,求该序列所有非空连续子序列的最大值之和。上述参数满足  。一个序列的非空连续子序列可以用两个下标 l和 r(其中 0≤l≤r<n)表示,对应的序列为​。两个非空连续子序列不同,当且仅当下标不同。 例如,当原序列为 [1,2,1,2]时,要计算子序列 [1]、[2]、[1]、[2]、[1,2]、[2,1]、[1,2]、[1,2,1]、[2,1,2]、[1,2,1,2] 的最大值之和,答案为 18。注意 [1,1]和 [2,2]虽然是原序列的子序列,但不是连续子序列,所以不应该被计算。另外,注意其中有一些值相同的子序列,但由于他们在原序列中的下标不同,属于不同的非空连续子序列,所以会被分别计算。  解决该问题有许多算法,以下程序使用分治算法,时间复杂度 试补全程序。   #include <iostream>  #include <algorithm>  #include <vector>    const int MAXN = 100000;    int n;  int a[MAXN];  long long ans;    void solve(int l, int r) {      if (l + 1 == r) {          ans += a[l];          return;      }      int mid = (l + r) >> 1;      std::vector<int> pre(a + mid, a + r);      for (int i = 1; i < r - mid; ++i) ①;      std::vector<long long> sum(r - mid + 1);      for (int i = 0; i < r - mid; ++i)          sum[i + 1] = sum[i] + pre[i];      for (int i = mid - l, j = mid, max = 0; i >= l; --i) {          while (j < r && ②) ++j;          max = std::max(max, a[i]);          ans += ③;          ans += ④;      }      solve(l, mid);      solve(mid, r);  }    int main() {      std::cin >> n;      for (int i = 0; i < n; ++i)          std::cin >> a[i];      ⑤;      std::cout << ans << std::endl;      return 0;  }   ①处应填()  ②处应填()  ③处应填()  ④处应填()  ⑤处应填() 1.  A.  pre[i] = std::max(pre[i - 1], a[i - 1])  B.  pre[i + 1] = std::max(pre[i],pre[i + 1])  C.  pre[i] = std::max(pre[i -1], a[i])  D.  pre[i] = std::max(pre[i], pre[i - 1]) 2.  A.  a[j] < max  B.  a[j] < a[i]  C.  pre[j - mid] < max  D.  pre[j - mid] > max 3.  A.  (long long)(j - mid) * max  B.  (long long)(j - mid) * (i - 1) * max  C.  sum[j - mid]  D.  sum[j - mid] * (i - 1) 4.  A.  (long long)(r - j) * max  B.  (long long)(r - j) * (mid - i) * max  C.  sum[r - mid] - sum[j - mid]  D.  (sum[r - mid] - sum[j - mid]) * (mid - i) 5.  A.  solve(0,n)  B.  solve(0,n - 1)  C.  solve(1,n)  D.  solve(1,n - 1)​。两个非空连续子序列不同,当且仅当下标不同。

例如,当原序列为 [1,2,1,2]时,要计算子序列 [1]、[2]、[1]、[2]、[1,2]、[2,1]、[1,2]、[1,2,1]、[2,1,2]、[1,2,1,2] 的最大值之和,答案为 18。注意 [1,1]和 [2,2]虽然是原序列的子序列,但不是连续子序列,所以不应该被计算。另外,注意其中有一些值相同的子序列,但由于他们在原序列中的下标不同,属于不同的非空连续子序列,所以会被分别计算。D6H100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

解决该问题有许多算法,以下程序使用分治算法,时间复杂度第 20 题 2.(最大值之和)给定整数序列 ,求该序列所有非空连续子序列的最大值之和。上述参数满足  。一个序列的非空连续子序列可以用两个下标 l和 r(其中 0≤l≤r<n)表示,对应的序列为​。两个非空连续子序列不同,当且仅当下标不同。 例如,当原序列为 [1,2,1,2]时,要计算子序列 [1]、[2]、[1]、[2]、[1,2]、[2,1]、[1,2]、[1,2,1]、[2,1,2]、[1,2,1,2] 的最大值之和,答案为 18。注意 [1,1]和 [2,2]虽然是原序列的子序列,但不是连续子序列,所以不应该被计算。另外,注意其中有一些值相同的子序列,但由于他们在原序列中的下标不同,属于不同的非空连续子序列,所以会被分别计算。  解决该问题有许多算法,以下程序使用分治算法,时间复杂度 试补全程序。   #include <iostream>  #include <algorithm>  #include <vector>    const int MAXN = 100000;    int n;  int a[MAXN];  long long ans;    void solve(int l, int r) {      if (l + 1 == r) {          ans += a[l];          return;      }      int mid = (l + r) >> 1;      std::vector<int> pre(a + mid, a + r);      for (int i = 1; i < r - mid; ++i) ①;      std::vector<long long> sum(r - mid + 1);      for (int i = 0; i < r - mid; ++i)          sum[i + 1] = sum[i] + pre[i];      for (int i = mid - l, j = mid, max = 0; i >= l; --i) {          while (j < r && ②) ++j;          max = std::max(max, a[i]);          ans += ③;          ans += ④;      }      solve(l, mid);      solve(mid, r);  }    int main() {      std::cin >> n;      for (int i = 0; i < n; ++i)          std::cin >> a[i];      ⑤;      std::cout << ans << std::endl;      return 0;  }   ①处应填()  ②处应填()  ③处应填()  ④处应填()  ⑤处应填() 1.  A.  pre[i] = std::max(pre[i - 1], a[i - 1])  B.  pre[i + 1] = std::max(pre[i],pre[i + 1])  C.  pre[i] = std::max(pre[i -1], a[i])  D.  pre[i] = std::max(pre[i], pre[i - 1]) 2.  A.  a[j] < max  B.  a[j] < a[i]  C.  pre[j - mid] < max  D.  pre[j - mid] > max 3.  A.  (long long)(j - mid) * max  B.  (long long)(j - mid) * (i - 1) * max  C.  sum[j - mid]  D.  sum[j - mid] * (i - 1) 4.  A.  (long long)(r - j) * max  B.  (long long)(r - j) * (mid - i) * max  C.  sum[r - mid] - sum[j - mid]  D.  (sum[r - mid] - sum[j - mid]) * (mid - i) 5.  A.  solve(0,n)  B.  solve(0,n - 1)  C.  solve(1,n)  D.  solve(1,n - 1)D6H100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
试补全程序。D6H100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
 D6H100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

  1. #include <iostream> 
  2. #include <algorithm> 
  3. #include <vector> 
  4.  
  5. const int MAXN = 100000; 
  6.  
  7. int n; 
  8. int a[MAXN]; 
  9. long long ans; 
  10.  
  11. void solve(int l, int r) { 
  12.     if (l + 1 == r) { 
  13.         ans += a[l]; 
  14.         return
  15.     } 
  16.     int mid = (l + r) >> 1; 
  17.     std::vector<int> pre(a + mid, a + r); 
  18.     for (int i = 1; i < r - mid; ++i) ①; 
  19.     std::vector<long long> sum(r - mid + 1); 
  20.     for (int i = 0; i < r - mid; ++i) 
  21.         sum[i + 1] = sum[i] + pre[i]; 
  22.     for (int i = mid - l, j = mid, max = 0; i >= l; --i) { 
  23.         while (j < r && ②) ++j; 
  24.         max = std::max(max, a[i]); 
  25.         ans += ③; 
  26.         ans += ④; 
  27.     } 
  28.     solve(l, mid); 
  29.     solve(mid, r); 
  30.  
  31. int main() { 
  32.     std::cin >> n; 
  33.     for (int i = 0; i < n; ++i) 
  34.         std::cin >> a[i]; 
  35.     ⑤; 
  36.     std::cout << ans << std::endl; 
  37.     return 0; 
 
  1. ①处应填()D6H100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

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

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

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

  5. ⑤处应填()D6H100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
    1.D6H100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
     A. D6H100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
    pre[i] = std::max(pre[i - 1], a[i - 1])D6H100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
     B. D6H100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
    pre[i + 1] = std::max(pre[i],pre[i + 1])D6H100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
     C. D6H100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
    pre[i] = std::max(pre[i -1], a[i])D6H100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
     D. D6H100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
    pre[i] = std::max(pre[i], pre[i - 1])D6H100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
    2.D6H100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
     A. D6H100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
    a[j] < maxD6H100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
     B. D6H100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
    a[j] < a[i]D6H100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
     C. D6H100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
    pre[j - mid] < maxD6H100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
     D. D6H100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
    pre[j - mid] > maxD6H100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
    3.D6H100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
     A. D6H100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
    (long long)(j - mid) * maxD6H100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
     B. D6H100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
    (long long)(j - mid) * (i - 1) * maxD6H100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
     C. D6H100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
    sum[j - mid]D6H100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
     D. D6H100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
    sum[j - mid] * (i - 1)D6H100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
    4.D6H100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
     A. D6H100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
    (long long)(r - j) * maxD6H100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
     B. D6H100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
    (long long)(r - j) * (mid - i) * maxD6H100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
     C. D6H100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
    sum[r - mid] - sum[j - mid]D6H100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
     D. D6H100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
    (sum[r - mid] - sum[j - mid]) * (mid - i)D6H100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
    5.D6H100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
     A. D6H100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
    solve(0,n)D6H100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
     B. D6H100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
    solve(0,n - 1)D6H100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
     C. D6H100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
    solve(1,n)D6H100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
     D. D6H100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
    solve(1,n - 1)D6H100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
     D6H100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

答案解析

相关题目

第 4 题    种树(tree) 【题目描述】 你是一个森林养护员,有一天,你接到了一个任务:在一片森林内的地块上种树,并养护至树木长到指定的高度。 森林的地图有n片地块,其中1号地块连接森林
第 3 题    结构体(struct) 【题目背景】 在C++等高级语言中,除了int和float等基本类型外,通常还可以自定义结构体类型。在本题当中,你需要模拟一种类似C++的高级语言的结构体
第 2 题    消消乐(game) 【题目描述】 小L现在在玩一个低配版本的消消乐,该版本的游戏是一维的,一次也只能消除两个相邻的元素。 现在,他有一个长度为n且仅由小写字母构成的字符串。我们
第 1 题    密码锁(lock) 【题目描述】 小Y有一把五个拨圈的密码锁。如图所示,每个拨圈上是从0到9的数字。每个拨圈都是从0到9的循环,即9拨动一个位置后可以变成0或8, 图1:密
第 20 题 2.(最大值之和)给定整数序列 ,求该序列所有非空连续子序列的最大值之和。上述参数满足  。一个序列的非空连续子序列可以用两个下标 l和 r(其中 0≤l≤r<n)表示,对应的序列
第 19 题 1. (第 k 小路径)给定一张 n 个点 m条边的有向无环图,定点编号从 0到n−1,对于一条路径,我们定义“路径序列”为该路径从起点出发依次经过的顶点编号构成的序列。求所有至少包含一
第 18 题 3. #include <vector>  #include <algorithm>  #include <iostream>    using na
第 17 题 2. #include <iostream>  #include <cmath>  #include <vector>  #include <a
第 16 题 1. #include <iostream>  using namespace std;  unsigned short f(unsigned short x) {     
第15题 现在用如下代码来计算下xn,其时间复杂度为() double quick_power(double x, unsigned n){  If(n == 0) return 1;  If(n =

提示声明

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

猜你喜欢