1 条题解

  • 0
    @ 2025-7-15 18:34:46

    方法思路

    1. 题目要求我们模拟修改方案的过程,并找出最终使用的方案版本
    2. 每次修改时,将区间[l,r]内的所有人的愤怒值+1
    3. 如果任何人的愤怒值超过其愤怒阈值,则停止修改,使用上一版方案
    4. 我们需要高效地处理区间更新操作,可以使用差分数组
    5. 在每次修改后,检查所有人的愤怒值是否超过阈值

    代码实现

    Java
    import java.util.*;
    import java.io.*;
    
    public class Main {
        public static void main(String[] args) throws IOException {
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
            String[] line = br.readLine().split(" ");
            int n = Integer.parseInt(line[0]);
            int m = Integer.parseInt(line[1]);
            
            int[] threshold = new int[n + 1]; // 愤怒阈值
            line = br.readLine().split(" ");
            for (int i = 1; i <= n; i++) {
                threshold[i] = Integer.parseInt(line[i - 1]);
            }
            
            int[] anger = new int[n + 1]; // 当前愤怒值
            
            for (int i = 1; i <= m; i++) {
                line = br.readLine().split(" ");
                int l = Integer.parseInt(line[0]);
                int r = Integer.parseInt(line[1]);
                
                // 区间[l,r]的愤怒值+1
                for (int j = l; j <= r; j++) {
                    anger[j]++;
                    
                    // 检查是否有人愤怒值超过阈值
                    if (anger[j] > threshold[j]) {
                        // 如果有,使用上一版方案
                        System.out.println(i - 1);
                        return;
                    }
                }
            }
            
            // 如果所有修改都完成了,使用最后一版方案
            System.out.println(m);
        }
    }
    
    
    C++
    #include <iostream>
    #include <vector>
    using namespace std;
    
    int main() {
        int n, m;
        cin >> n >> m;
        
        vector<int> threshold(n + 1);  // 愤怒阈值
        for (int i = 1; i <= n; i++) {
            cin >> threshold[i];
        }
        
        vector<int> anger(n + 1, 0);  // 当前愤怒值
        
        for (int i = 1; i <= m; i++) {
            int l, r;
            cin >> l >> r;
            
            // 区间[l,r]的愤怒值+1
            for (int j = l; j <= r; j++) {
                anger[j]++;
                
                // 检查是否有人愤怒值超过阈值
                if (anger[j] > threshold[j]) {
                    // 如果有,使用上一版方案
                    cout << (i - 1) << endl;
                    return 0;
                }
            }
        }
        
        // 如果所有修改都完成了,使用最后一版方案
        cout << m << endl;
        return 0;
    }
    
    
    • 1

    信息

    ID
    84
    时间
    3000ms
    内存
    256MiB
    难度
    5
    标签
    递交数
    6
    已通过
    1
    上传者