mcbbnb 2023-08-12 18:09 采纳率: 85.7%
浏览 8
已结题

c++找区间次大值问题!

时间限制:C/C++ 1000MS,其他语言 2000MS
内存限制:C/C++ 256MB,其他语言 512MB
出题人:
描述
给定一个长度为 n 的整数序列 a 1 ,a 2 ,…,a n ,请回答 q 次询问。对于每次询问,请找出区间 [l,r] 中的严格次大值。如果区间 [l,r] 中不存在严格次大值,输出 −1a 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,1q1000,1a 
i1000000,1≤l i≤r i ≤n
  • 写回答

2条回答 默认 最新

  • 不良使 新星创作者: python技术领域 2023-08-12 18:36
    关注
    
    #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,看看有没有帮助的

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 8月20日
  • 已采纳回答 8月12日
  • 创建了问题 8月12日