2024-01-09 impl From<Infallible> for Error / 『詳解 Rust アトミック操作とロック』 / PAST #16 G
昨日 (2024-01-08) の impl TryFrom<T> for T
の Error = Infallible
https://doc.rust-lang.org/std/convert/trait.TryFrom.html#impl-TryFrom%3CU%3E-for-T の件は、 crates:http の http::uri::Builder
https://docs.rs/http/1.0.0/http/uri/struct.Builder.html にならって、 impl From<Infallible> for Error
https://docs.rs/http/1.0.0/http/struct.Error.html#impl-From%3CInfallible%3E-for-Error を定義することで回避することにした。
おそらく到達しないと思うので unreachable!()
で実装した。
『詳解 Rust アトミック操作とロック』を読んだ。
https://www.oreilly.co.jp/books/9784814400515/
Rustでは並行性を持つプログラムを安全に記述することができます。本書はその並行プログラムの基盤となる、アトミック操作とロックの仕組みについての理解を深め、より安全で効率の良いコードを書くための指南書です。難解だと思われがちなアトミック処理、ロック、メモリオーダリングのような低レイヤを詳細に理解し、アーキテクチャやOSによる相違を知ることで、安全で高性能な並行処理プログラムを実装できるようになります。Rustユーザはもちろん非ユーザにとっても低レイヤプログラミングの優れたリソースとなる一冊です。
アトミック操作・メモリオーダリングなどを学び、 Arc
や Mutex
などを実装する。あまり理解せず読み流したけど、きちんとやれば Rust の並行処理の基礎的な部品についての理解が深まりそう。時間があれば手を動かしたい。
PAST #16 第16回 アルゴリズム実技検定(過去問)
- G - N個の三角形
https://atcoder.jp/contests/past16-open/tasks/past202309_g
- 提出: https://atcoder.jp/contests/past16-open/submissions/49184695
- 解説 AC
- 先頭固定あとの 2 つを DFS で
- 使い切れれば 1 つのケース、そうでなければ増えない
- 間に合うかの判断が難しい
use proconio::input;
fn dfs(a: &[usize]) -> usize {
if a.is_empty() {
return 1;
}
let mut count = 0_usize;
let (i, a_i) = (0, a[0]);
for j in 1..a.len() {
let a_j = a[j];
for k in j + 1..a.len() {
let a_k = a[k];
let (a_i, a_j) = (a_i.min(a_j), a_i.max(a_j));
let (a_j, a_k) = (a_j.min(a_k), a_j.max(a_k));
if a_i + a_j > a_k {
let b = a
.iter()
.copied()
.enumerate()
.filter(|(l, _)| l != &i && l != &j && l != &k)
.map(|(_, x)| x)
.collect::<Vec<usize>>();
count += dfs(&b);
}
}
}
count
}
fn main() {
input! {
n: usize,
a: [usize; 3 * n],
};
let ans = dfs(&a);
println!("{}", ans);
}
今日のコミット。