結果
問題 | No.789 範囲の合計 |
ユーザー |
|
提出日時 | 2025-01-16 07:14:22 |
言語 | Rust (1.83.0 + proconio) |
結果 |
AC
|
実行時間 | 101 ms / 1,000 ms |
コード長 | 12,943 bytes |
コンパイル時間 | 11,906 ms |
コンパイル使用メモリ | 401,864 KB |
実行使用メモリ | 45,056 KB |
最終ジャッジ日時 | 2025-01-16 07:14:46 |
合計ジャッジ時間 | 14,939 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 15 |
ソースコード
#[allow(unused_imports)] use std::{ collections::{*}, cmp::{Reverse, Ordering, Ord, PartialOrd, PartialEq}, mem::{swap}, time::Instant, fs::File, io::{self, stdin, read_to_string}, hash::Hash, }; #[allow(unused_imports)] use crate::input::{Usize1, Chars}; pub fn bit_length(x: usize)->usize{ 64-x.saturating_sub(1).leading_zeros()as usize } pub trait SegTreeMonoid{ type S: Copy; fn identity()->Self::S; fn op(a: &Self::S, b: &Self::S)->Self::S; } pub struct DynamicSegmenttree<M> where M: SegTreeMonoid{ n: usize, data: Vec<(M::S, Option<usize>, Option<usize>)>, } impl<M> DynamicSegmenttree<M> where M: SegTreeMonoid{ pub fn new(n: usize)->Self{ let n = n.next_power_of_two(); DynamicSegmenttree{ n, data: vec![(M::identity(), None, None)] } } pub fn set(&mut self, p: usize, x: M::S){ self.update_dfs(0, 0, self.n, p, x, false); } pub fn push(&mut self, p: usize, x: M::S){ self.update_dfs(0, 0, self.n, p, x, true); } fn update_dfs(&mut self, p: usize, l: usize, r: usize, idx: usize, x: M::S, f: bool)->M::S{ if l+1==r{ let (pre, left, right) = self.data[p]; if f{ self.data[p] = (M::op(&pre, &x), left, right); } else { self.data[p] = (x, left, right); } return self.data[p].0; } let (_, mut left, mut right) = self.data[p]; let m = (l+r)/2; let res = if idx < m{ let res_l = if let Some(ln) = left{ self.update_dfs(ln, l, m, idx, x, f) } else { let nex = self.data.len(); left = Some(nex); self.data.push((M::identity(), None, None)); self.update_dfs(nex, l, m, idx, x, f) }; let res_r = if let Some(rn) = right{ self.data[rn].0 } else { M::identity() }; M::op(&res_l, &res_r) } else { let res_l = if let Some(ln) = left{ self.data[ln].0 } else { M::identity() }; let res_r = if let Some(rn) = right{ self.update_dfs(rn, m, r, idx, x, f) } else { let nex = self.data.len(); right = Some(nex); self.data.push((M::identity(), None, None)); self.update_dfs(nex, m, r, idx, x, f) }; M::op(&res_l, &res_r) }; self.data[p] = (res, left, right); res } pub fn prod(&self, l: usize, r: usize)->M::S{ self.prod_dfs(0, 0, self.n, l, r) } fn prod_dfs(&self, p: usize, l: usize, r: usize, x: usize, y: usize)->M::S{ if r <= x||y <= l{return M::identity();} let (z, left, right) =self.data[p]; if x <= l && r <= y{ return z; } let m = (l+r)/2; let res_l = if let Some(ln) = left{ self.prod_dfs(ln, l, m, x, y) } else { M::identity() }; let res_r = if let Some(rn) = right{ self.prod_dfs(rn, m, r, x, y) } else { M::identity() }; M::op(&res_l, &res_r) } pub fn max_right<F>(&self, l: usize, f: F)->usize where F: Fn(&M::S)->bool{ assert!(f(&M::identity())); if l==self.n{return self.n} let mut ac = M::identity(); self.max_right_dfs(0, 0, self.n, l, &mut ac, &f) } fn max_right_dfs<F>(&self, p: usize, l: usize, r: usize, x: usize, ac: &mut M::S, f: &F)->usize where F: Fn(&M::S)->bool{ if r <= x{ return x } if l >= x{ let res = M::op(ac, &self.data[p].0); if f(&res){ *ac = res; return r; } else if r-l==1{ return l; } } let m = (l+r)/2; let (_, left, right) = self.data[p]; let ret = if let Some(ln) = left{ self.max_right_dfs(ln, l, m, x, ac, f) } else { x }; if ret < m{ return ret; } else if let Some(rn) = right{ self.max_right_dfs(rn, m, r, x, ac, f) } else { r } } pub fn min_left<F>(&self, r: usize, f: F)->usize where F: Fn(&M::S)->bool{ assert!(f(&M::identity())); if r==0{return 0;} let mut ac = M::identity(); self.min_left_dfs(0, 0, self.n, r, &mut ac, &f) } fn min_left_dfs<F>(&self, p: usize, l: usize, r: usize, x: usize, ac: &mut M::S, f: &F)->usize where F: Fn(&M::S)->bool{ if x <= l{ return l; } else if r <= x{ let res = M::op(&self.data[p].0, ac); if f(&res){ *ac = res; return l; } else if l+1==r{ return r; } } let m = (l+r)/2; let (_, left, right) = self.data[p]; let ret = if let Some(rn) = right{ self.min_left_dfs(rn, m, r, x, ac, f) } else { m }; if ret > m{ ret } else if let Some(ln) = left{ self.min_left_dfs(ln, l, m, x, ac, f) } else { l } } pub fn all_prod(&self)->M::S{ self.data[0].0 } } struct M; impl SegTreeMonoid for M{ type S = usize; fn identity() -> Self::S { 0 } fn op(&a: &Self::S, &b: &Self::S) -> Self::S { a+b } } // qryxipさんのコードをお借りしています!!ありがとうございます!! fn main() { let __fastout_stdout = ::std::io::stdout(); let __fastout_stdout = &mut ::std::io::BufWriter::new(__fastout_stdout.lock()); #[allow(unused_macros)] macro_rules ! print {($ ($ tt : tt) *) =>{{ use std :: io :: Write as _ ; :: std :: write ! (__fastout_stdout, $ ($ tt) *) . unwrap () ;}};} #[allow(unused_macros)] macro_rules ! println {($ ($ tt : tt) *) =>{{ use std :: io :: Write as _ ; :: std :: writeln ! (__fastout_stdout, $ ($ tt) *) . unwrap ();}} ;} let __fastout_res = { // 本体コードはここから input!{ n: usize, query: [(usize, usize, usize); n], } let mut segtree = DynamicSegmenttree::<M>::new(1000000001); let mut ans = 0; for &(p, x, y) in &query{ if p==0{ segtree.push(x, y); } else { let res = segtree.prod(x, y+1); ans += res; } } std::println!("{}", ans); // 本体コードここまで }; <::std::io::BufWriter<_> as ::std::io::Write>::flush(__fastout_stdout).unwrap(); __fastout_res } #[allow(unused)] pub mod input { pub use crate::{input, input_inner, read, readable}; use std::{ cell::RefCell, fmt::Debug, io::{self, BufRead, Read}, rc::Rc, str::{FromStr, SplitWhitespace}, }; #[macro_export] macro_rules! input { (from $scanner:ident; $($tt:tt)*) => { $crate::input::input_inner!(@scanner($scanner), @tts($($tt)*)) }; ($($tt:tt)*) => { let __scanner = $crate::input::DEFAULT_SCANNER.with(|__scanner| __scanner.clone()); let mut __scanner_ref = __scanner.borrow_mut(); if let $crate::input::Scanner::Uninited = *__scanner_ref { *__scanner_ref = $crate::input::Scanner::stdin_auto().unwrap(); } $crate::input::input_inner!(@scanner(__scanner_ref), @tts($($tt)*)); ::std::mem::drop(__scanner_ref); ::std::mem::drop(__scanner); }; } #[macro_export] macro_rules! input_inner { (@scanner($scanner:ident), @tts()) => {}; (@scanner($scanner:ident), @tts(mut $single_tt_pat:tt : $readable:tt)) => { let mut $single_tt_pat = $crate::input::read!(from $scanner { $readable }); }; (@scanner($scanner:ident), @tts($single_tt_pat:tt : $readable:tt)) => { let $single_tt_pat = $crate::input::read!(from $scanner { $readable }); }; (@scanner($scanner:ident), @tts(mut $single_tt_pat:tt : $readable:tt, $($rest:tt)*)) => { $crate::input::input_inner!(@scanner($scanner), @tts(mut $single_tt_pat: $readable)); $crate::input::input_inner!(@scanner($scanner), @tts($($rest)*)); }; (@scanner($scanner:ident), @tts($single_tt_pat:tt : $readable:tt, $($rest:tt)*)) => { $crate::input::input_inner!(@scanner($scanner), @tts($single_tt_pat: $readable)); $crate::input::input_inner!(@scanner($scanner), @tts($($rest)*)); }; } #[macro_export] macro_rules! read { (from $scanner:ident { [$tt:tt] }) => { $crate::input::read!(from $scanner { [$tt; $crate::read!(from $scanner { usize })] }) }; (from $scanner:ident { [$tt:tt; $n:expr] }) => { (0..$n).map(|_| $crate::input::read!(from $scanner { $tt })).collect::<Vec<_>>() }; (from $scanner:ident { ($($tt:tt),+) }) => { ($($crate::read!(from $scanner { $tt })),*) }; (from $scanner:ident { $ty:ty }) => { <$ty as $crate::input::Readable>::read_from_scanner(&mut $scanner) }; } #[macro_export] macro_rules! readable { ($name:ident; |$scanner:ident| { $($body:tt)* }) => { $crate::input::readable!($name; |$scanner| -> () { $($body)* }); }; ($name:ident; |$scanner:ident| $expr:expr) => { $crate::input::readable!($name; |$scanner| -> () { $expr }); }; ($name:ident; |$scanner:ident| -> $output:ty { $($body:tt)* }) => { enum $name {} impl $crate::input::Readable for $name { type Output = $output; fn read_from_scanner(mut $scanner: &mut $crate::input::Scanner) -> $output { $($body)* } } }; } pub enum Scanner { Uninited, Once { words: SplitWhitespace<'static>, }, Lines { rdr: Box<dyn BufRead>, words: SplitWhitespace<'static>, }, } impl Scanner { pub fn stdin_auto() -> io::Result<Self> { if cfg!(debug_assertions) { Ok(Self::lines(Box::leak(Box::new(io::stdin())).lock())) } else { Self::once(io::stdin()) } } pub fn once<R: Read>(mut rdr: R) -> io::Result<Self> { let mut buf = String::with_capacity(1024); rdr.read_to_string(&mut buf)?; let words = Box::leak(buf.into_boxed_str()).split_whitespace(); Ok(Self::Once { words }) } pub fn lines<R: BufRead + 'static>(rdr: R) -> Self { Self::Lines { rdr: Box::new(rdr), words: "".split_whitespace(), } } pub fn parse_next_unwrap<T: FromStr>(&mut self) -> T where T::Err: Debug, { match self { Self::Uninited => None, Self::Once { words } => words.next(), Self::Lines { rdr, words } => words.next().or_else(|| { let mut line = "".to_owned(); rdr.read_line(&mut line).unwrap(); *words = Box::leak(line.into_boxed_str()).split_whitespace(); words.next() }), } .expect("reached EOF") .parse() .unwrap() } } thread_local! { pub static DEFAULT_SCANNER: Rc<RefCell<Scanner>> = Rc::new(RefCell::new(Scanner::Uninited)); } pub trait Readable { type Output; fn read_from_scanner(scanner: &mut Scanner) -> Self::Output; } impl<T: FromStr> Readable for T where T::Err: Debug, { type Output = Self; fn read_from_scanner(scanner: &mut Scanner) -> Self { scanner.parse_next_unwrap() } } pub enum Usize1 {} pub enum Chars {} impl Readable for Usize1 { type Output = usize; fn read_from_scanner(scanner: &mut Scanner) -> Self::Output { let val: usize = scanner.parse_next_unwrap(); if val == 0 { panic!("Usize1-0-parse-error"); } val - 1 } } impl Readable for Chars { type Output = Vec<char>; fn read_from_scanner(scanner: &mut Scanner) -> Self::Output { let val: String = scanner.parse_next_unwrap(); val.chars().collect() } } }