🐡

ganyariya with ABC231

2021/12/12に公開

解説

https://scrapbox.io/ganariya-competitive/AtCoderBeginnerContest231_A問題100点_「Water_Pressure」

https://scrapbox.io/ganariya-competitive/AtCoderBeginnerContest231_B問題200点_「Election」

https://scrapbox.io/ganariya-competitive/AtCoderBeginnerContest231_C問題300点_「Counting_2」

https://scrapbox.io/ganariya-competitive/AtCoderBeginnerContest231_D問題400点_「Neighbors」

https://scrapbox.io/ganariya-competitive/AtCoderBeginnerContest231_E問題500点_「Minimal_payments」

https://scrapbox.io/ganariya-competitive/AtCoderBeginnerContest231_F問題500点_「Jealous_Two」

個人的感想と学び

感想

参加日はお酒を飲んでいたので unrated で出ました。
せっかくなのでバーチャルの姿で動画を取りながら参加しています(コンテスト後に動画を後悔しています)。

go の map の書き方を覚えていて嬉しくなっている自分がいました。
(毎回忘れていたので。)

https://www.youtube.com/watch?v=X3-Nga7vbdA

学び

map

Go の map は make(map[string]int) のように map[T]R として書く。

コンストラクタ

Go のコンストラクタは、NewT() *T のように、ポインタを返す。
コンストラクタ関数内では、&Tnew(T) としてメモリ領域に確保する。

レシーバ

func (p *Person) hello (g string) string {} のように、 Person という型にメソッドを生やす機能をレシーバという。
こういう書き方は Nim に近いなぁって思いました。
拡張しやすくていいですね。

type UnionFind struct {
 	par   []int
 	sizes []int
 }
 
 func NewUnionFind(n int) *UnionFind {
 	ret := &UnionFind{
 		par:   make([]int, n),
 		sizes: make([]int, n),
 	}
 	for i := 0; i < n; i++ {
 		ret.par[i] = i
 	}
 	return ret
 }
 
 func (uf *UnionFind) Find(x int) int {
 	if x == uf.par[x] {
 		return x
 	} else {
 		ret := uf.Find(uf.par[x])
 		uf.par[x] = ret
 		return ret
 	}
 }
 
 func (uf *UnionFind) Unite(x, y int) bool {
 	x = uf.Find(x)
 	y = uf.Find(y)
 	if x == y {
 		return false
 	}
 	if uf.sizes[x] < uf.sizes[y] {
 		x, y = y, x
 	}
 	uf.par[y] = x
 	uf.sizes[x] += uf.sizes[y]
 	return true
 }
 
 func (uf *UnionFind) Same(x, y int) bool {
 	return uf.Find(x) == uf.Find(y)
 }
 
 func (uf *UnionFind) GetSize(x int) int {
 	return uf.sizes[uf.Find(x)]
 }
 
GitHubで編集を提案

Discussion