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"
275
275
matching = " Words"
276
276
meta = { using = [" maplit" , " num" , " proconio" ] }
277
277
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
+
278
285
[examples .agc020-c ]
279
286
type = " Normal"
280
287
name = " AGC020: C - Median Sum"
@@ -468,3 +475,17 @@ name = "Sumitomo Mitsui Trust Bank Programming Contest 2019: C - 100 to 105"
468
475
url = " https://atcoder.jp/contests/sumitrust2019/tasks/sumitb2019_c"
469
476
matching = " Words"
470
477
meta = { 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