結果
問題 | No.1675 Strange Minimum Query |
ユーザー | manta1130 |
提出日時 | 2021-09-11 19:46:34 |
言語 | Rust (1.77.0 + proconio) |
結果 |
AC
|
実行時間 | 413 ms / 2,000 ms |
コード長 | 26,023 bytes |
コンパイル時間 | 15,610 ms |
コンパイル使用メモリ | 378,412 KB |
実行使用メモリ | 14,468 KB |
最終ジャッジ日時 | 2024-06-23 04:18:12 |
合計ジャッジ時間 | 25,494 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge5 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 1 ms
5,248 KB |
testcase_01 | AC | 1 ms
5,248 KB |
testcase_02 | AC | 1 ms
5,376 KB |
testcase_03 | AC | 166 ms
7,936 KB |
testcase_04 | AC | 149 ms
8,924 KB |
testcase_05 | AC | 14 ms
6,400 KB |
testcase_06 | AC | 195 ms
8,704 KB |
testcase_07 | AC | 213 ms
10,292 KB |
testcase_08 | AC | 1 ms
5,376 KB |
testcase_09 | AC | 2 ms
5,376 KB |
testcase_10 | AC | 116 ms
10,952 KB |
testcase_11 | AC | 32 ms
9,252 KB |
testcase_12 | AC | 128 ms
11,384 KB |
testcase_13 | AC | 185 ms
14,440 KB |
testcase_14 | AC | 260 ms
14,348 KB |
testcase_15 | AC | 224 ms
14,336 KB |
testcase_16 | AC | 1 ms
5,376 KB |
testcase_17 | AC | 49 ms
5,376 KB |
testcase_18 | AC | 70 ms
5,376 KB |
testcase_19 | AC | 96 ms
10,592 KB |
testcase_20 | AC | 226 ms
12,104 KB |
testcase_21 | AC | 198 ms
12,140 KB |
testcase_22 | AC | 261 ms
12,904 KB |
testcase_23 | AC | 200 ms
7,192 KB |
testcase_24 | AC | 180 ms
8,540 KB |
testcase_25 | AC | 133 ms
6,044 KB |
testcase_26 | AC | 64 ms
6,696 KB |
testcase_27 | AC | 172 ms
11,784 KB |
testcase_28 | AC | 87 ms
10,132 KB |
testcase_29 | AC | 61 ms
9,900 KB |
testcase_30 | AC | 62 ms
6,456 KB |
testcase_31 | AC | 334 ms
9,704 KB |
testcase_32 | AC | 376 ms
14,256 KB |
testcase_33 | AC | 357 ms
14,320 KB |
testcase_34 | AC | 413 ms
14,340 KB |
testcase_35 | AC | 317 ms
14,344 KB |
testcase_36 | AC | 318 ms
14,468 KB |
コンパイルメッセージ
warning: unused imports: `BTreeMap`, `BinaryHeap` --> src/main.rs:4:24 | 4 | use std::collections::{BTreeMap, BinaryHeap}; | ^^^^^^^^ ^^^^^^^^^^ | = note: `#[warn(unused_imports)]` on by default
ソースコード
#[allow(unused_imports)] use std::io::{stdout, BufWriter, Write}; use std::collections::{BTreeMap, BinaryHeap}; fn main() { let out = stdout(); let mut out = BufWriter::new(out.lock()); inputv! { n:usize,q:usize } let mut query = vec![]; let mut max = 0; for _ in 0..q { inputv! { l:usize,r:usize,b:i64 } max = std::cmp::max(max, b); query.push((l - 1, r, b)); } query.sort_by_key(|q| q.2); let mut lazysegtree: LazySegtree<MinUpdate> = vec![1_000_000_000; n].into(); for &(l, r, b) in &query { lazysegtree.apply_range(l, r, b); } for &(l, r, b) in &query { if lazysegtree.prod(l, r) != b { writeln!(out, "-1").unwrap(); return; } } for i in 0..n { if i == n - 1 { writeln!(out, "{}", lazysegtree.get(i)).unwrap(); } else { write!(out, "{} ", lazysegtree.get(i)).unwrap(); } } } //https://github.com/rust-lang-ja/ac-library-rs //https://github.com/manta1130/competitive-template-rs use input::*; use lazysegtree::*; use segtree::*; use segtree_template::*; pub mod input { use std::cell::RefCell; use std::io; pub const SPLIT_DELIMITER: char = ' '; pub use std::io::prelude::*; thread_local! { pub static INPUT_BUFFER:RefCell<std::collections::VecDeque<String>>=RefCell::new(std::collections::VecDeque::new()); } #[macro_export] macro_rules! input_internal { ($x:ident : $t:ty) => { INPUT_BUFFER.with(|p| { if p.borrow().len() == 0 { let temp_str = input_line_str(); let mut split_result_iter = temp_str .split(SPLIT_DELIMITER) .map(|q| q.to_string()) .collect::<std::collections::VecDeque<_>>(); p.borrow_mut().append(&mut split_result_iter) } }); let mut buf_split_result = String::new(); INPUT_BUFFER.with(|p| buf_split_result = p.borrow_mut().pop_front().unwrap()); let $x: $t = buf_split_result.parse().unwrap(); }; (mut $x:ident : $t:ty) => { INPUT_BUFFER.with(|p| { if p.borrow().len() == 0 { let temp_str = input_line_str(); let mut split_result_iter = temp_str .split(SPLIT_DELIMITER) .map(|q| q.to_string()) .collect::<std::collections::VecDeque<_>>(); p.borrow_mut().append(&mut split_result_iter) } }); let mut buf_split_result = String::new(); INPUT_BUFFER.with(|p| buf_split_result = p.borrow_mut().pop_front().unwrap()); let mut $x: $t = buf_split_result.parse().unwrap(); }; } pub fn input_buffer_is_empty() -> bool { let mut empty = false; INPUT_BUFFER.with(|p| { if p.borrow().len() == 0 { empty = true; } }); empty } #[macro_export] macro_rules! inputv { ($i:ident : $t:ty) => { input_internal!{$i : $t} }; (mut $i:ident : $t:ty) => { input_internal!{mut $i : $t} }; ($i:ident : $t:ty $(,)*) => { input_internal!{$i : $t} }; (mut $i:ident : $t:ty $(,)*) => { input_internal!{mut $i : $t} }; (mut $i:ident : $t:ty,$($q:tt)*) => { input_internal!{mut $i : $t} inputv!{$($q)*} }; ($i:ident : $t:ty,$($q:tt)*) => { input_internal!{$i : $t} inputv!{$($q)*} }; } pub fn input_all() { INPUT_BUFFER.with(|p| { if p.borrow().len() == 0 { let mut temp_str = String::new(); std::io::stdin().read_to_string(&mut temp_str).unwrap(); let mut split_result_iter = temp_str .split_whitespace() .map(|q| q.to_string()) .collect::<std::collections::VecDeque<_>>(); p.borrow_mut().append(&mut split_result_iter) } }); } pub fn input_line_str() -> String { let mut s = String::new(); io::stdin().read_line(&mut s).unwrap(); s.trim().to_string() } #[allow(clippy::match_wild_err_arm)] pub fn input_vector<T>() -> Vec<T> where T: std::str::FromStr, { let mut v: Vec<T> = Vec::new(); let s = input_line_str(); let split_result = s.split(SPLIT_DELIMITER); for z in split_result { let buf = match z.parse() { Ok(r) => r, Err(_) => panic!("Parse Error",), }; v.push(buf); } v } #[allow(clippy::match_wild_err_arm)] pub fn input_vector_row<T>(n: usize) -> Vec<T> where T: std::str::FromStr, { let mut v = Vec::with_capacity(n); for _ in 0..n { let buf = match input_line_str().parse() { Ok(r) => r, Err(_) => panic!("Parse Error",), }; v.push(buf); } v } pub trait ToCharVec { fn to_charvec(&self) -> Vec<char>; } impl ToCharVec for String { fn to_charvec(&self) -> Vec<char> { self.to_string().chars().collect::<Vec<_>>() } } } pub mod internal_bit { #[allow(dead_code)] pub(crate) fn ceil_pow2(n: u32) -> u32 { 32 - n.saturating_sub(1).leading_zeros() } } pub mod internal_type_traits { use std::{ fmt, iter::{Product, Sum}, ops::{ Add, AddAssign, BitAnd, BitAndAssign, BitOr, BitOrAssign, BitXor, BitXorAssign, Div, DivAssign, Mul, MulAssign, Not, Rem, RemAssign, Shl, ShlAssign, Shr, ShrAssign, Sub, SubAssign, }, }; pub trait Integral: 'static + Send + Sync + Copy + Ord + Not<Output = Self> + Add<Output = Self> + Sub<Output = Self> + Mul<Output = Self> + Div<Output = Self> + Rem<Output = Self> + AddAssign + SubAssign + MulAssign + DivAssign + RemAssign + Sum + Product + BitOr<Output = Self> + BitAnd<Output = Self> + BitXor<Output = Self> + BitOrAssign + BitAndAssign + BitXorAssign + Shl<Output = Self> + Shr<Output = Self> + ShlAssign + ShrAssign + fmt::Display + fmt::Debug + fmt::Binary + fmt::Octal + Zero + One + BoundedBelow + BoundedAbove { } pub trait Zero { fn zero() -> Self; } pub trait One { fn one() -> Self; } pub trait BoundedBelow { fn min_value() -> Self; } pub trait BoundedAbove { fn max_value() -> Self; } macro_rules! impl_integral { ($($ty:ty),*) => { $( impl Zero for $ty { #[inline] fn zero() -> Self { 0 } } impl One for $ty { #[inline] fn one() -> Self { 1 } } impl BoundedBelow for $ty { #[inline] fn min_value() -> Self { Self::min_value() } } impl BoundedAbove for $ty { #[inline] fn max_value() -> Self { Self::max_value() } } impl Integral for $ty {} )* }; } impl_integral!(i8, i16, i32, i64, i128, isize, u8, u16, u32, u64, u128, usize); } pub mod lazysegtree { use crate::internal_bit::ceil_pow2; use crate::Monoid; pub trait MapMonoid { type M: Monoid; type F: Clone; fn identity_element() -> <Self::M as Monoid>::S { Self::M::identity() } fn binary_operation( a: &<Self::M as Monoid>::S, b: &<Self::M as Monoid>::S, ) -> <Self::M as Monoid>::S { Self::M::binary_operation(a, b) } fn identity_map() -> Self::F; fn mapping(f: &Self::F, x: &<Self::M as Monoid>::S) -> <Self::M as Monoid>::S; fn composition(f: &Self::F, g: &Self::F) -> Self::F; } impl<F: MapMonoid> Default for LazySegtree<F> { fn default() -> Self { Self::new(0) } } impl<F: MapMonoid> LazySegtree<F> { pub fn new(n: usize) -> Self { vec![F::identity_element(); n].into() } } impl<F: MapMonoid> From<Vec<<F::M as Monoid>::S>> for LazySegtree<F> { fn from(v: Vec<<F::M as Monoid>::S>) -> Self { let n = v.len(); let log = ceil_pow2(n as u32) as usize; let size = 1 << log; let mut d = vec![F::identity_element(); 2 * size]; let lz = vec![F::identity_map(); size]; d[size..(size + n)].clone_from_slice(&v); let mut ret = LazySegtree { n, size, log, d, lz, }; for i in (1..size).rev() { ret.update(i); } ret } } impl<F: MapMonoid> LazySegtree<F> { pub fn set(&mut self, mut p: usize, x: <F::M as Monoid>::S) { assert!(p < self.n); p += self.size; for i in (1..=self.log).rev() { self.push(p >> i); } self.d[p] = x; for i in 1..=self.log { self.update(p >> i); } } pub fn get(&mut self, mut p: usize) -> <F::M as Monoid>::S { assert!(p < self.n); p += self.size; for i in (1..=self.log).rev() { self.push(p >> i); } self.d[p].clone() } pub fn prod(&mut self, mut l: usize, mut r: usize) -> <F::M as Monoid>::S { assert!(l <= r && r <= self.n); if l == r { return F::identity_element(); } l += self.size; r += self.size; for i in (1..=self.log).rev() { if ((l >> i) << i) != l { self.push(l >> i); } if ((r >> i) << i) != r { self.push(r >> i); } } let mut sml = F::identity_element(); let mut smr = F::identity_element(); while l < r { if l & 1 != 0 { sml = F::binary_operation(&sml, &self.d[l]); l += 1; } if r & 1 != 0 { r -= 1; smr = F::binary_operation(&self.d[r], &smr); } l >>= 1; r >>= 1; } F::binary_operation(&sml, &smr) } pub fn all_prod(&self) -> <F::M as Monoid>::S { self.d[1].clone() } pub fn apply(&mut self, mut p: usize, f: F::F) { assert!(p < self.n); p += self.size; for i in (1..=self.log).rev() { self.push(p >> i); } self.d[p] = F::mapping(&f, &self.d[p]); for i in 1..=self.log { self.update(p >> i); } } pub fn apply_range(&mut self, mut l: usize, mut r: usize, f: F::F) { assert!(l <= r && r <= self.n); if l == r { return; } l += self.size; r += self.size; for i in (1..=self.log).rev() { if ((l >> i) << i) != l { self.push(l >> i); } if ((r >> i) << i) != r { self.push((r - 1) >> i); } } { let l2 = l; let r2 = r; while l < r { if l & 1 != 0 { self.all_apply(l, f.clone()); l += 1; } if r & 1 != 0 { r -= 1; self.all_apply(r, f.clone()); } l >>= 1; r >>= 1; } l = l2; r = r2; } for i in 1..=self.log { if ((l >> i) << i) != l { self.update(l >> i); } if ((r >> i) << i) != r { self.update((r - 1) >> i); } } } pub fn max_right<G>(&mut self, mut l: usize, g: G) -> usize where G: Fn(<F::M as Monoid>::S) -> bool, { assert!(l <= self.n); assert!(g(F::identity_element())); if l == self.n { return self.n; } l += self.size; for i in (1..=self.log).rev() { self.push(l >> i); } let mut sm = F::identity_element(); while { while l % 2 == 0 { l >>= 1; } if !g(F::binary_operation(&sm, &self.d[l])) { while l < self.size { self.push(l); l *= 2; let res = F::binary_operation(&sm, &self.d[l]); if g(res.clone()) { sm = res; l += 1; } } return l - self.size; } sm = F::binary_operation(&sm, &self.d[l]); l += 1; { let l = l as isize; (l & -l) != l } } {} self.n } pub fn min_left<G>(&mut self, mut r: usize, g: G) -> usize where G: Fn(<F::M as Monoid>::S) -> bool, { assert!(r <= self.n); assert!(g(F::identity_element())); if r == 0 { return 0; } r += self.size; for i in (1..=self.log).rev() { self.push((r - 1) >> i); } let mut sm = F::identity_element(); while { r -= 1; while r > 1 && r % 2 != 0 { r >>= 1; } if !g(F::binary_operation(&self.d[r], &sm)) { while r < self.size { self.push(r); r = 2 * r + 1; let res = F::binary_operation(&self.d[r], &sm); if g(res.clone()) { sm = res; r -= 1; } } return r + 1 - self.size; } sm = F::binary_operation(&self.d[r], &sm); { let r = r as isize; (r & -r) != r } } {} 0 } } pub struct LazySegtree<F> where F: MapMonoid, { n: usize, size: usize, log: usize, d: Vec<<F::M as Monoid>::S>, lz: Vec<F::F>, } impl<F> LazySegtree<F> where F: MapMonoid, { fn update(&mut self, k: usize) { self.d[k] = F::binary_operation(&self.d[2 * k], &self.d[2 * k + 1]); } fn all_apply(&mut self, k: usize, f: F::F) { self.d[k] = F::mapping(&f, &self.d[k]); if k < self.size { self.lz[k] = F::composition(&f, &self.lz[k]); } } fn push(&mut self, k: usize) { self.all_apply(2 * k, self.lz[k].clone()); self.all_apply(2 * k + 1, self.lz[k].clone()); self.lz[k] = F::identity_map(); } } use std::fmt::{Debug, Error, Formatter, Write}; impl<F> Debug for LazySegtree<F> where F: MapMonoid, F::F: Debug, <F::M as Monoid>::S: Debug, { fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error> { for i in 0..self.log { for j in 0..1 << i { f.write_fmt(format_args!( "{:?}[{:?}]\t", self.d[(1 << i) + j], self.lz[(1 << i) + j] ))?; } f.write_char('\n')?; } for i in 0..self.size { f.write_fmt(format_args!("{:?}\t", self.d[self.size + i]))?; } Ok(()) } } } pub mod segtree { use crate::internal_bit::ceil_pow2; use crate::internal_type_traits::{BoundedAbove, BoundedBelow, One, Zero}; use std::cmp::{max, min}; use std::convert::Infallible; use std::marker::PhantomData; use std::ops::{Add, Mul}; pub trait Monoid { type S: Clone; fn identity() -> Self::S; fn binary_operation(a: &Self::S, b: &Self::S) -> Self::S; } pub struct Max<S>(Infallible, PhantomData<fn() -> S>); impl<S> Monoid for Max<S> where S: Copy + Ord + BoundedBelow, { type S = S; fn identity() -> Self::S { S::min_value() } fn binary_operation(a: &Self::S, b: &Self::S) -> Self::S { max(*a, *b) } } pub struct Min<S>(Infallible, PhantomData<fn() -> S>); impl<S> Monoid for Min<S> where S: Copy + Ord + BoundedAbove, { type S = S; fn identity() -> Self::S { S::max_value() } fn binary_operation(a: &Self::S, b: &Self::S) -> Self::S { min(*a, *b) } } pub struct Additive<S>(Infallible, PhantomData<fn() -> S>); impl<S> Monoid for Additive<S> where S: Copy + Add<Output = S> + Zero, { type S = S; fn identity() -> Self::S { S::zero() } fn binary_operation(a: &Self::S, b: &Self::S) -> Self::S { *a + *b } } pub struct Multiplicative<S>(Infallible, PhantomData<fn() -> S>); impl<S> Monoid for Multiplicative<S> where S: Copy + Mul<Output = S> + One, { type S = S; fn identity() -> Self::S { S::one() } fn binary_operation(a: &Self::S, b: &Self::S) -> Self::S { *a * *b } } impl<M: Monoid> Default for Segtree<M> { fn default() -> Self { Segtree::new(0) } } impl<M: Monoid> Segtree<M> { pub fn new(n: usize) -> Segtree<M> { vec![M::identity(); n].into() } } impl<M: Monoid> From<Vec<M::S>> for Segtree<M> { fn from(v: Vec<M::S>) -> Self { let n = v.len(); let log = ceil_pow2(n as u32) as usize; let size = 1 << log; let mut d = vec![M::identity(); 2 * size]; d[size..(size + n)].clone_from_slice(&v); let mut ret = Segtree { n, size, log, d }; for i in (1..size).rev() { ret.update(i); } ret } } impl<M: Monoid> Segtree<M> { pub fn set(&mut self, mut p: usize, x: M::S) { assert!(p < self.n); p += self.size; self.d[p] = x; for i in 1..=self.log { self.update(p >> i); } } pub fn get(&self, p: usize) -> M::S { assert!(p < self.n); self.d[p + self.size].clone() } pub fn prod(&self, mut l: usize, mut r: usize) -> M::S { assert!(l <= r && r <= self.n); let mut sml = M::identity(); let mut smr = M::identity(); l += self.size; r += self.size; while l < r { if l & 1 != 0 { sml = M::binary_operation(&sml, &self.d[l]); l += 1; } if r & 1 != 0 { r -= 1; smr = M::binary_operation(&self.d[r], &smr); } l >>= 1; r >>= 1; } M::binary_operation(&sml, &smr) } pub fn all_prod(&self) -> M::S { self.d[1].clone() } pub fn max_right<F>(&self, mut l: usize, f: F) -> usize where F: Fn(&M::S) -> bool, { assert!(l <= self.n); assert!(f(&M::identity())); if l == self.n { return self.n; } l += self.size; let mut sm = M::identity(); while { while l % 2 == 0 { l >>= 1; } if !f(&M::binary_operation(&sm, &self.d[l])) { while l < self.size { l *= 2; let res = M::binary_operation(&sm, &self.d[l]); if f(&res) { sm = res; l += 1; } } return l - self.size; } sm = M::binary_operation(&sm, &self.d[l]); l += 1; { let l = l as isize; (l & -l) != l } } {} self.n } pub fn min_left<F>(&self, mut r: usize, f: F) -> usize where F: Fn(&M::S) -> bool, { assert!(r <= self.n); assert!(f(&M::identity())); if r == 0 { return 0; } r += self.size; let mut sm = M::identity(); while { r -= 1; while r > 1 && r % 2 == 1 { r >>= 1; } if !f(&M::binary_operation(&self.d[r], &sm)) { while r < self.size { r = 2 * r + 1; let res = M::binary_operation(&self.d[r], &sm); if f(&res) { sm = res; r -= 1; } } return r + 1 - self.size; } sm = M::binary_operation(&self.d[r], &sm); { let r = r as isize; (r & -r) != r } } {} 0 } fn update(&mut self, k: usize) { self.d[k] = M::binary_operation(&self.d[2 * k], &self.d[2 * k + 1]); } } pub struct Segtree<M> where M: Monoid, { n: usize, size: usize, log: usize, d: Vec<M::S>, } } pub mod segtree_template { use super::lazysegtree::*; use super::segtree::*; pub struct MaxAdd; impl MapMonoid for MaxAdd { type M = Max<i64>; type F = i64; fn identity_map() -> Self::F { 0 } fn mapping(&f: &i64, &x: &i64) -> i64 { f + x } fn composition(&f: &i64, &g: &i64) -> i64 { f + g } } pub struct MinAdd; impl MapMonoid for MinAdd { type M = Max<i64>; type F = i64; fn identity_map() -> Self::F { 0 } fn mapping(&f: &i64, &x: &i64) -> i64 { f + x } fn composition(&f: &i64, &g: &i64) -> i64 { f + g } } const INF: i64 = i64::max_value(); pub struct MaxForLazy; impl Monoid for MaxForLazy { type S = i64; fn identity() -> Self::S { INF } fn binary_operation(a: &Self::S, b: &Self::S) -> Self::S { if *a == INF { *b } else if *b == INF { *a } else { std::cmp::max(*a, *b) } } } pub struct MinForLazy; impl Monoid for MinForLazy { type S = i64; fn identity() -> Self::S { INF } fn binary_operation(a: &Self::S, b: &Self::S) -> Self::S { if *a == INF { *b } else if *b == INF { *a } else { std::cmp::min(*a, *b) } } } pub struct MaxUpdate; impl MapMonoid for MaxUpdate { type M = MaxForLazy; type F = i64; fn identity_map() -> Self::F { INF } fn mapping(&f: &i64, &x: &i64) -> i64 { if f == INF { x } else { f } } fn composition(&f: &i64, &g: &i64) -> i64 { if f == INF { g } else { f } } } pub struct MinUpdate; impl MapMonoid for MinUpdate { type M = MinForLazy; type F = i64; fn identity_map() -> Self::F { INF } fn mapping(&f: &i64, &x: &i64) -> i64 { if f == INF { x } else { f } } fn composition(&f: &i64, &g: &i64) -> i64 { if f == INF { g } else { f } } } }