Guest User

V1

a guest
Sep 27th, 2026
36
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Rust 4.36 KB | None | 0 0
  1. use crate::algo_lib::collections::array_2d::Array2D;
  2.  
  3. use crate::algo_lib::io::input::Input;
  4. use crate::algo_lib::io::output::Output;
  5. fn solve(input: &mut Input, out: &mut Output) {
  6.     let n = input.usize();
  7.     let k = input.usize();
  8.     let q = input.usize();
  9.     let mut a = input.vec::<i32>(n);
  10.     a.extend_from_slice(&a.clone());
  11.     let mut queries = vec![];
  12.     for _ in 0..q {
  13.         let l = input.usize() - 1;
  14.         let mut r = input.usize();
  15.         if l >= r {
  16.             r += n;
  17.         }
  18.         queries.push(l..r);
  19.     }
  20.     let mut res = vec![i32::MIN; q];
  21.     let mut answered = vec![false; q];
  22.     loop {
  23.         let mut min_r = usize::MAX;
  24.         for i in 0..q {
  25.             if res[i] == i32::MIN {
  26.                 min_r = min_r.min(queries[i].end);
  27.             }
  28.         }
  29.         if min_r == usize::MAX {
  30.             break;
  31.         }
  32.         let mid = min_r;
  33.         let mut max_r = mid;
  34.         let mut min_l = usize::MAX;
  35.         for i in 0..q {
  36.             if res[i] == i32::MIN && queries[i].start < mid {
  37.                 max_r = max_r.max(queries[i].end);
  38.                 min_l = min_l.min(queries[i].start);
  39.             }
  40.         }
  41.         for use_center in 0..2 {
  42.             let dp_right = {
  43.                 let len = max_r - mid;
  44.                 let mut dp = vec![Array2D::new(i32::MIN / 2, 2, k + 1); len + 1];
  45.                 dp[0][use_center][0] = 0;
  46.                 for i in 0..len {
  47.                     let cur_val = a[mid + i];
  48.                     for segm_open in 0..2 {
  49.                         for j in 0..=k {
  50.                             dp[i + 1][segm_open][j] = dp[i][segm_open][j];
  51.                         }
  52.                     }
  53.                     for j in 0..k {
  54.                         dp[i + 1][1][j] = dp[i + 1][1][j].max(dp[i][0][j] - cur_val);
  55.                     }
  56.                     for j in 0..k {
  57.                         dp[i + 1][0][j + 1] = dp[i + 1][0][j + 1]
  58.                             .max(dp[i][1][j] + cur_val);
  59.                     }
  60.                 }
  61.                 dp
  62.             };
  63.             let dp_left = {
  64.                 let len = mid - min_l;
  65.                 let mut dp = vec![Array2D::new(i32::MIN / 2, 2, k + 1); len + 1];
  66.                 dp[0][use_center][0] = 0;
  67.                 for i in 0..len {
  68.                     let cur_val = a[mid - 1 - i];
  69.                     for segm_open in 0..2 {
  70.                         for j in 0..=k {
  71.                             dp[i + 1][segm_open][j] = dp[i][segm_open][j];
  72.                         }
  73.                     }
  74.                     for j in 0..k {
  75.                         dp[i + 1][1][j + 1] = dp[i + 1][1][j + 1]
  76.                             .max(dp[i][0][j] + cur_val);
  77.                     }
  78.                     for j in 0..=k {
  79.                         dp[i + 1][0][j] = dp[i + 1][0][j].max(dp[i][1][j] - cur_val);
  80.                     }
  81.                 }
  82.                 dp
  83.             };
  84.             for i in 0..q {
  85.                 if answered[i] || queries[i].start >= mid {
  86.                     continue;
  87.                 }
  88.                 let left_len = mid - queries[i].start;
  89.                 let right_len = queries[i].end - mid;
  90.                 let mut best = i32::MIN;
  91.                 let mut right_cnt_iter = k;
  92.                 for left_cnt in 0..=k {
  93.                     while right_cnt_iter > 0
  94.                         && (right_cnt_iter + left_cnt > k
  95.                             || dp_right[right_len][0][right_cnt_iter] == i32::MIN / 2)
  96.                     {
  97.                         right_cnt_iter -= 1;
  98.                     }
  99.                     best = best
  100.                         .max(
  101.                             dp_left[left_len][0][left_cnt]
  102.                                 + dp_right[right_len][0][right_cnt_iter],
  103.                         );
  104.                 }
  105.                 res[i] = res[i].max(best);
  106.                 if use_center == 1 {
  107.                     answered[i] = true;
  108.                 }
  109.             }
  110.         }
  111.     }
  112.     for &x in res.iter() {
  113.         out.println(x);
  114.     }
  115. }
  116. pub(crate) fn run(mut input: Input, mut output: Output) -> bool {
  117.     solve(&mut input, &mut output);
  118.     output.flush();
  119.     true
  120. }
  121.  
  122. fn main() {
  123.     let input = crate::algo_lib::io::input::Input::new_stdin();
  124.     let mut output = crate::algo_lib::io::output::Output::new_stdout();
  125.     run(input, output);
  126. }
Advertisement
Add Comment
Please, Sign In to add comment