главная Π½ΠΎΠ²ΠΎΠ΅ Π»ΡƒΡ‡ΡˆΠ΅Π΅ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ

БСгодня Ρ€Π΅ΡˆΠ°Π΅ΠΌ Π·Π°Π΄Π°Ρ‡Ρƒ 2054. Two Best Non-Overlapping Events. Π‘ΡƒΠ΄Π΅ΠΌ Π·Π°ΠΊΡ€Π΅ΠΏΠ»ΡΡ‚ΡŒ Π΄Π²ΠΎΠΈΡ‡Π½Ρ‹ΠΉ поиск ;)

πŸ˜‡ ОписаниС Π·Π°Π΄Π°Ρ‡ΠΈ

Π”Π°Π½ список событий с извСстными для Π½ΠΈΡ… start_time, end_time ΠΈ value. НуТно Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ максимум Π΄Π²Π° Π½Π΅ΠΏΠ΅Ρ€Π΅ΡΠ΅ΠΊΠ°ΡŽΡ‰ΠΈΡ…ΡΡ события с максимальной ΠΎΠ±Ρ‰Π΅ΠΉ Ρ†Π΅Π½Π½ΠΎΡΡ‚ΡŒΡŽ. Бобытия ΠΏΠ΅Ρ€Π΅ΡΠ΅ΠΊΠ°ΡŽΡ‚ΡΡ, Ссли ΠΎΠ΄Π½ΠΎ начинаСтся Π΄ΠΎ окончания Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ.

πŸ’‘ ИдСя

Π‘ΠΎΡ€Ρ‚ΠΈΡ€ΡƒΠ΅ΠΌ события ΠΏΠΎ end_time (Π² ΡƒΠ±Ρ‹Π²Π°ΡŽΡ‰Π΅ΠΌ порядкС). Для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ события ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ Π΄Π²ΠΎΠΈΡ‡Π½Ρ‹ΠΉ поиск, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π°ΠΉΡ‚ΠΈ всС Π·Π°ΠΊΠ°Π½Ρ‡ΠΈΠ²Π°ΡŽΡ‰ΠΈΠ΅ΡΡ Π΄ΠΎ Π΅Π³ΠΎ Π½Π°Ρ‡Π°Π»Π°. ΠžΡΡ‚Π°Ρ‘Ρ‚ΡΡ Π½Π°ΠΉΡ‚ΠΈ срСди Π½ΠΈΡ… событиС с максимальной Ρ†Π΅Π½Π½ΠΎΡΡ‚ΡŒΡŽ, для этого Π±ΡƒΠ΄Π΅ΠΌ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ Π½Π°ΠΊΠΎΠΏΠ»Π΅Π½Π½Ρ‹Π΅ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹Π΅ цСнности Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠΌ массивС max_vals.

πŸ› οΈ ΠŸΠΎΠ΄Ρ…ΠΎΠ΄

  1. Π‘ΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²ΠΊΠ° событий: По end_time Π² порядкС убывания.
  2. ΠŸΡ€Π΅Π΄ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹Ρ… цСнностСй: Π‘ΠΎΠ·Π΄Π°Ρ‘ΠΌ массив max_vals с Π½Π°ΠΊΠΎΠΏΠ»Π΅Π½Π½ΠΎΠΉ максимальной Ρ†Π΅Π½Π½ΠΎΡΡ‚ΡŒΡŽ событий (справа-Π½Π°Π»Π΅Π²ΠΎ).
  3. Π˜Ρ‚Π΅Ρ€Π°Ρ†ΠΈΡ ΠΈ поиск:
    • Для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ события Π½Π°Ρ…ΠΎΠ΄ΠΈΠΌ ΠΏΠ΅Ρ€Π²ΠΎΠ΅, Π·Π°ΠΊΠ°Π½Ρ‡ΠΈΠ²Π°ΡŽΡ‰Π΅Π΅ΡΡ Ρ€Π°Π½ΡŒΡˆΠ΅ Π΅Π³ΠΎ, Ρ‡Π΅Ρ€Π΅Π· Π΄Π²ΠΎΠΈΡ‡Π½Ρ‹ΠΉ поиск.
    • Π‘ΡƒΠΌΠΌΠΈΡ€ΡƒΠ΅ΠΌ цСнности Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ события ΠΈ Π½Π°ΠΊΠΎΠΏΠ»Π΅Π½Π½ΠΎΠΉ максимальной цСнности ΠΏΠΎ Π½Π°ΠΉΠ΄Π΅Π½Π½ΠΎΠΌΡƒ индСксу, обновляя ΠΎΠ±Ρ‰ΠΈΠΉ максимум.

⏱️ Асимптотика

Π˜ΡΡ…ΠΎΠ΄Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ

impl Solution {
    pub fn max_two_events(events: Vec<Vec<i32>>) -> i32 {
        let mut events = events;

        // Sort events by end time in descending order
        events.sort_by(|a, b| b[1].cmp(&a[1]));

        let n = events.len();
        let mut max_vals = vec![0; n + 1]; // To store max values from right to left

        // Populate max_vals array with maximum values from right to left
        for i in (0..n).rev() {
            max_vals[i] = max_vals[i + 1].max(events[i][2]);
        }

        let mut best = 0;

        // Iterate over each event to find the best combination
        for i in 0..n {
            let current_value = events[i][2];

            // Binary search for the first event that ends before the current event starts
            let end_time = events[i][0] - 1;
            let idx = events.binary_search_by(|event| end_time.cmp(&event[1]))
                .unwrap_or_else(|x| x);

            let total_value = if idx < n { current_value + max_vals[idx] } else { current_value };

            // Update the best value
            best = best.max(total_value);
        }

        best
    }
}