Submission #62106239


Source Code Expand

use proconio::{input, marker::Usize1};

/*
f(L, R)を削除するときに、
a_iを下端として削除する回数(a_iの寄与)を考える。

a_iを下端として削除する回数は、
j<iかつa_j=a_i - 1なるjの最大値(存在しなければ0), 
k>iかつa_k=a_i - 1なるkの最小値(存在しなければn)を用いて(i-j)*(k-i)で求められる。

ただし、
3 4 4 3

のような場合、4 4を重複して数えてしまうので、
左端についてはl<iかつa_l=a_iなるlの最大値(存在しなければ0)を求めて、
min(i-j, i-l)*(k-i)で求められる。
*/

fn main() {
    input! {
        n: usize,
        a: [usize; n],
    }

    let mut v = vec![vec![]; n+1];
    let mut idxes = vec![None; n+1];
    for (i, &ai) in a.iter().enumerate() {
        v[ai].push(i);
        if idxes[ai].is_none() {
            idxes[ai] = Some(0);
        }
    }

    let mut ans = 0;
    let mut last_seen = vec![None; n+1];
    for (i, &ai) in a.iter().enumerate() {
        let mut l = if let Some(idx) = last_seen[ai-1] {
            idx as i64
        }  else {
            -1
        };
        l = l.max(
            if let Some(idx) = last_seen[ai] {
                idx
            } else {
                -1
            }
        );
        let r = if let Some(idx) = idxes[ai-1] {
            v[ai-1][idx] as i64
        } else {
            n as i64
        };

        if idxes[ai].unwrap() + 1 == v[ai].len() {
            idxes[ai] = None;
        } else {
            idxes[ai] = Some(idxes[ai].unwrap()+1);
        }

        last_seen[ai] = Some(i as i64);
        ans += (i as i64 -l) * (r-i as i64);

    }
    println!("{}", ans);

}

pub trait VecLibs<T: std::cmp::Ord> {
    fn lower_bound(&self, elm: T) -> usize;
    fn upper_bound(&self, elm: T) -> usize;
}

impl<T: std::cmp::Ord> VecLibs<T> for Vec<T> {
    fn lower_bound(&self, elm: T) -> usize {
        let mut left = 0;
        let mut right = self.len();
        while left < right {
            let mid = (left + right) / 2;
            if self[mid] < elm {
                left = mid + 1;
            } else {
                right = mid;
            }
        }
        left
    }

    fn upper_bound(&self, elm: T) -> usize {
        let mut left = 0;
        let mut right = self.len();
        while left < right {
            let mid = (left + right) / 2;
            if self[mid] <= elm {
                left = mid + 1;
            } else {
                right = mid;
            }
        }
        left
    }
}

Submission Info

Submission Time
Task F - Double Sum 3
User ardRiriy
Language Rust (rustc 1.70.0)
Score 525
Code Size 2538 Byte
Status AC
Exec Time 57 ms
Memory 36692 KiB

Compile Error

warning: unused import: `marker::Usize1`
 --> src/main.rs:1:23
  |
1 | use proconio::{input, marker::Usize1};
  |                       ^^^^^^^^^^^^^^
  |
  = note: `#[warn(unused_imports)]` on by default

Judge Result

Set Name Sample All
Score / Max Score 0 / 0 525 / 525
Status
AC × 3
AC × 31
Set Name Test Cases
Sample 00_sample_00.txt, 00_sample_01.txt, 00_sample_02.txt
All 00_sample_00.txt, 00_sample_01.txt, 00_sample_02.txt, 01_handmade_00.txt, 01_handmade_01.txt, 01_handmade_02.txt, 02_permutation_00.txt, 02_permutation_01.txt, 02_permutation_02.txt, 02_permutation_03.txt, 02_permutation_04.txt, 02_permutation_05.txt, 02_permutation_06.txt, 02_permutation_07.txt, 02_permutation_08.txt, 02_permutation_09.txt, 02_permutation_10.txt, 02_permutation_11.txt, 03_random_00.txt, 03_random_01.txt, 03_random_02.txt, 03_random_03.txt, 03_random_04.txt, 03_random_05.txt, 03_random_06.txt, 03_random_07.txt, 03_random_08.txt, 03_random_09.txt, 03_random_10.txt, 03_random_11.txt, 03_random_12.txt
Case Name Status Exec Time Memory
00_sample_00.txt AC 1 ms 2064 KiB
00_sample_01.txt AC 0 ms 1808 KiB
00_sample_02.txt AC 0 ms 2064 KiB
01_handmade_00.txt AC 0 ms 2016 KiB
01_handmade_01.txt AC 13 ms 15804 KiB
01_handmade_02.txt AC 28 ms 36692 KiB
02_permutation_00.txt AC 13 ms 12344 KiB
02_permutation_01.txt AC 18 ms 15768 KiB
02_permutation_02.txt AC 48 ms 35936 KiB
02_permutation_03.txt AC 43 ms 31576 KiB
02_permutation_04.txt AC 50 ms 33988 KiB
02_permutation_05.txt AC 52 ms 36676 KiB
02_permutation_06.txt AC 57 ms 36576 KiB
02_permutation_07.txt AC 49 ms 36520 KiB
02_permutation_08.txt AC 51 ms 36592 KiB
02_permutation_09.txt AC 54 ms 36572 KiB
02_permutation_10.txt AC 28 ms 36548 KiB
02_permutation_11.txt AC 28 ms 36532 KiB
03_random_00.txt AC 6 ms 6444 KiB
03_random_01.txt AC 7 ms 7540 KiB
03_random_02.txt AC 21 ms 17348 KiB
03_random_03.txt AC 7 ms 7328 KiB
03_random_04.txt AC 13 ms 11832 KiB
03_random_05.txt AC 44 ms 31500 KiB
03_random_06.txt AC 45 ms 31444 KiB
03_random_07.txt AC 46 ms 31488 KiB
03_random_08.txt AC 44 ms 31612 KiB
03_random_09.txt AC 47 ms 31500 KiB
03_random_10.txt AC 3 ms 4776 KiB
03_random_11.txt AC 6 ms 7904 KiB
03_random_12.txt AC 6 ms 7504 KiB