时间限制:C/C++ 1000MS,其他语言 2000MS
内存限制:C/C++ 256MB,其他语言 512MB
出题人:
描述
给定一个长度为 n 的整数序列 a 1 ,a 2 ,…,a n ,请回答 q 次询问。对于每次询问,请找出区间 [l,r] 中的严格次大值。如果区间 [l,r] 中不存在严格次大值,输出 −1
记 a l,…,a r中最大的数为 m,那么区间 [l,r] 中的严格次大值定义为 a l ,…,a r中比 m 小的数中最大的一个
输入描述
第一行两个整数 n,q,表示序列的长度和询问的次数
第二行 n 个整数 a 1 ,a 2 ,…,a n,表示序列中的数
接下来 q 行,每行两个整数 l i ,r i,表示每次询问的区间的左右端点
输出描述
输出 q 行,每行一个整数,表示每次询问的答案
用例输入 1
10 3
5 5 4 4 3 3 2 2 1 1
1 10
5 6
3 5
用例输出 1
4
-1
3
提示
对于 100% 的测试数据,3≤n≤1000,1≤q≤1000,1≤a
i≤1000000,1≤l i≤r i ≤n
![](https://profile-avatar.csdnimg.cn/default.jpg!4)
c++找区间次大值问题!
- 写回答
- 好问题 0 提建议
- 追加酬金
- 关注问题
- 邀请回答
-
2条回答 默认 最新
关注
#include <iostream> #include <vector> using namespace std; int findSecondMax(vector<int>& nums, int l, int r) { int maxVal = nums[l]; int secondMaxVal = -1; for (int i = l+1; i <= r; i++) { if (nums[i] > maxVal) { secondMaxVal = maxVal; maxVal = nums[i]; } else if (nums[i] < maxVal) { secondMaxVal = max(secondMaxVal, nums[i]); } } return secondMaxVal; } int main() { int n, q; cin >> n >> q; vector<int> nums(n); for (int i = 0; i < n; i++) { cin >> nums[i]; } while (q--) { int l, r; cin >> l >> r; int result = findSecondMax(nums, l-1, r-1); cout << result << endl; } return 0; }
这是一个demo,看看有没有帮助的
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 2无用
悬赏问题
- ¥100 用数字代替ip主机号断与旋转链接号段
- ¥20 学校内手机热点不能使用
- ¥15 qwen模型微调训练时grad_norm为0.0或为nan
- ¥15 若依- Spring cloud-plus集成阿里云schedulerX再控制台应用管理找不到实例
- ¥15 用vs2022 fortran调试只无法查看数组的值,显示发生未指定的错误
- ¥50 SGD Gateway 是否可以与 SGD Server 装在一台服务器上?
- ¥15 gge梦幻西游的地图制作
- ¥15 对计算机的学习没有方向
- ¥15 用VBA抓取淘宝的发票号码和下载发票pdf遇到的问题
- ¥20 java excel导出有什么解决方案