File tree Expand file tree Collapse file tree 4 files changed +144
-0
lines changed
Expand file tree Collapse file tree 4 files changed +144
-0
lines changed Original file line number Diff line number Diff line change 1+ // https://atcoder.jp/contests/abc169/tasks/abc169_c
2+ //
3+ // 以下のクレートを使用。
4+ // - `num`
5+ // - `num-rational`
6+ // - `proconio`
7+
8+ use num:: rational:: Ratio ;
9+ use proconio:: input;
10+
11+ // 有理数型である[`num_rational::Ratio<_>`]を使う。
12+ //
13+ // `Ratio<T>`に対する`FromStr`は`"Tの形式"`または`"Tの形式/Tの形式"`を受け付ける。
14+ // よって入力をパースするときはAはそのまま、
15+ // Bは小数点下が2桁で固定なので`(_.replace('.', "") + "/100").parse().unwrap()`とすれば良い。
16+ //
17+ // そして[`.to_integer()`]で「0方向に丸めた整数」が得られるので`(_ * _).to_integer()`を答えとすれば良い。
18+ //
19+ // [`num_rational::Ratio<_>`]: https://docs.rs/num-rational/0.2.4/num_rational/struct.Ratio.html
20+ // [`.to_integer()`]: https://docs.rs/num-rational/0.2.4/num_rational/struct.Ratio.html#method.to_integer
21+
22+ fn main ( ) {
23+ // [`proconio::input!`]で入力を読む。
24+ //
25+ // [`proconio::input!`]: https://docs.rs/proconio/0.3.6/proconio/macro.input.html
26+ input ! {
27+ a: Ratio <u64 >,
28+ b: String ,
29+ }
30+
31+ let b = ( b. replace ( '.' , "" ) + "/100" ) . parse :: < Ratio < _ > > ( ) . unwrap ( ) ;
32+ println ! ( "{}" , ( a * b) . to_integer( ) ) ;
33+ }
Original file line number Diff line number Diff line change 1+ // https://atcoder.jp/contests/tokiomarine2020/tasks/tokiomarine2020_a
2+ //
3+ // 以下のクレートを使用。
4+ // - `ascii`
5+ // - `proconio`
6+
7+ use ascii:: AsciiString ;
8+ use proconio:: input;
9+
10+ fn main ( ) {
11+ // Sを[`ascii::AsciiString`]として、[`proconio::input!`]で入力を読む。
12+ //
13+ // [`ascii::AsciiString`]: https://docs.rs/ascii/1.0.0/ascii/struct.AsciiString.html
14+ // [`proconio::input!`]: https://docs.rs/proconio/0.3.6/proconio/macro.input.html
15+ input ! {
16+ s: AsciiString ,
17+ }
18+
19+ // [`AsciiStr`] / `AsciiString`は
20+ //
21+ // 1. [`usize`の範囲でアクセス可能]であり**かつ**
22+ // 2. そのまま[`Display`]可能
23+ //
24+ // であることから、このような問題で変換を挟まずに簡潔に書くことができる。
25+ //
26+ // `ascii`クレートを使わずに行うなら、
27+ //
28+ // 1. Sを`String`として読み、`&s[..3]`としてスライスを取得する
29+ // 2. Sを`String`として読み、`s.chars().take(3).collect::<String>()`
30+ // 3. Sを[`proconio::marker::Bytes`]経由で`Vec<u8>`として読み(あるいは`String`から`.into_bytes()`する)、`std::str::from_utf8(&s[..3]).unwrap()`
31+ //
32+ // の2つの方法がある。
33+ //
34+ // [`AsciiStr`]: https://docs.rs/ascii/1.0.0/ascii/struct.AsciiStr.html
35+ // [`usize`の範囲でアクセス可能]: https://docs.rs/ascii/1.0.0/ascii/struct.AsciiStr.html#impl-Index%3CRangeTo%3Cusize%3E%3E
36+ // [`Display`]: https://doc.rust-lang.org/1.42.0/std/fmt/trait.Display.html
37+ // [`proconio::marker::Bytes`]: https://docs.rs/proconio/0.3.6/proconio/marker/enum.Bytes.html
38+ println ! ( "{}" , & s[ ..3 ] ) ;
39+ }
Original file line number Diff line number Diff line change 1+ // https://atcoder.jp/contests/tokiomarine2020/tasks/tokiomarine2020_a
2+ //
3+ // 以下のクレートを使用。
4+ // - `itertools`
5+ // - `itertools-num`
6+ // - `proconio`
7+
8+ use itertools:: Itertools as _;
9+ use itertools_num:: ItertoolsNum as _;
10+ use proconio:: input;
11+ use std:: cmp;
12+
13+ fn main ( ) {
14+ // [`proconio::input!`]で入力を読む。
15+ //
16+ // [`proconio::input!`]: https://docs.rs/proconio/0.3.6/proconio/macro.input.html
17+ input ! {
18+ n: usize ,
19+ k: usize ,
20+ mut r#as: [ usize ; n] ,
21+ }
22+
23+ for _ in 0 ..k {
24+ // NもAも`usize`で持っておけば、numeric castは一箇所で済む。
25+
26+ let mut imos = vec ! [ 0 ; n + 1 ] ;
27+
28+ for ( i, & a) in r#as. iter ( ) . enumerate ( ) {
29+ let l = i. saturating_sub ( a) ;
30+ let r = cmp:: min ( i + a + 1 , n) ;
31+ imos[ l] += 1 ;
32+ imos[ r] -= 1 ;
33+ }
34+
35+ // [`itertools_num::ItertoolsNum::cumsom`]を使って`imos`を復元する。
36+ //
37+ // [`itertools_num::ItertoolsNum::cumsom`]: https://docs.rs/itertools-num/0.1.3/itertools_num/trait.ItertoolsNum.html#method.cumsum
38+ r#as = imos[ ..n] . iter ( ) . map ( |& x| x as usize ) . cumsum ( ) . collect ( ) ;
39+
40+ if r#as. iter ( ) . all ( |& a| a == n) {
41+ break ;
42+ }
43+ }
44+
45+ // [`itertools::Itertools::format`]でスペース区切りにしたものを`println!`する。
46+ //
47+ // 注意としてこのメソッドの返り値はイテレータを`RefCell<Option<_>>`の形で保持していており、二度displayしようとするとpanicする。
48+ //
49+ // [`itertools::Itertools::format`]: https://docs.rs/itertools/0.9.0/itertools/trait.Itertools.html#method.format
50+ println ! ( "{}" , r#as. into_iter( ) . format( " " ) ) ;
51+ }
Original file line number Diff line number Diff line change @@ -275,6 +275,13 @@ url = "https://atcoder.jp/contests/abc168/tasks/abc168_e"
275275matching = " Words"
276276meta = { using = [" maplit" , " num" , " proconio" ] }
277277
278+ [examples .abc169-c ]
279+ type = " Normal"
280+ name = " ABC169 - C - Multiplication 3"
281+ url = " https://atcoder.jp/contests/abc169/tasks/abc169_c"
282+ matching = " Words"
283+ meta = { using = [" num" , " proconio" ] }
284+
278285[examples .agc020-c ]
279286type = " Normal"
280287name = " AGC020: C - Median Sum"
@@ -468,3 +475,17 @@ name = "Sumitomo Mitsui Trust Bank Programming Contest 2019: C - 100 to 105"
468475url = " https://atcoder.jp/contests/sumitrust2019/tasks/sumitb2019_c"
469476matching = " Words"
470477meta = { using = [" fixedbitset" , " proconio" ] }
478+
479+ [examples .tokiomarine2020-a ]
480+ type = " Normal"
481+ name = " Tokio Marine & Nichido Fire Insurance Programming Contest 2020: A - Nickname"
482+ url = " https://atcoder.jp/contests/tokiomarine2020/tasks/tokiomarine2020_a"
483+ matching = " Words"
484+ meta = { using = [" ascii" , " proconio" ] }
485+
486+ [examples .tokiomarine2020-c ]
487+ type = " Normal"
488+ name = " Tokio Marine & Nichido Fire Insurance Programming Contest 2020: C - Lamps"
489+ url = " https://atcoder.jp/contests/tokiomarine2020/tasks/tokiomarine2020_c"
490+ matching = " Words"
491+ meta = { using = [" itertools" , " itertools-num" , " proconio" ] }
You can’t perform that action at this time.
0 commit comments