Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Goで競技プログラミングの辛いポイントを言っていく

Sponsored · Your Podcast. Everywhere. Effortlessly. Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
Avatar for ogataso ogataso
August 18, 2025
600

 Goで競技プログラミングの辛いポイントを言っていく

Go言語で競技プログラミングをやってみて、辛かったポイントをまとめました!

Avatar for ogataso

ogataso

August 18, 2025
Tweet

Transcript

  1. 今日発表すること Go言語で競プロやってみて苦労したこと、対処法 • 標準入力がちょい面倒 • stringがイミュータブル • ハッシュマップしかない • bigintが使いにくい

    C++でそこそこやった経験があるので、 比較しつつ紹介していきます! 知らなかったことが一つでもあればヨシ
  2. Go C++ var sc = bufio.NewScanner(os.Stdin) var wr = bufio.NewWriter(os.Stdout)

    defer wr.Flush() sc.Split(bufio.ScanWords) sc.Buffer([]byte{}, math.MaxInt32) var n int if sc.Scan() { n, _ = strconv.Atoi(sc.Text()) fmt.Fprintf(wr, "Scanned integer: %d\n", n) }
  3. Go C++ var sc = bufio.NewScanner(os.Stdin) var wr = bufio.NewWriter(os.Stdout)

    defer wr.Flush() sc.Split(bufio.ScanWords) sc.Buffer([]byte{}, math.MaxInt32) var n int if sc.Scan() { n, _ = strconv.Atoi(sc.Text()) fmt.Fprintf(wr, "Scanned integer: %d\n", n) } bufioを使って、標準入力からのデータを 一度に読み込み、バッファしておくように する
  4. Go C++ var sc = bufio.NewScanner(os.Stdin) var wr = bufio.NewWriter(os.Stdout)

    defer wr.Flush() sc.Split(bufio.ScanWords) sc.Buffer([]byte{}, math.MaxInt32) var n int if sc.Scan() { n, _ = strconv.Atoi(sc.Text()) fmt.Fprintf(wr, "Scanned integer: %d\n", n) } bufioを使って、標準入力からのデータを 一度に読み込み、バッファしておくように する sc.Scan, sc.Text()で空白(改行)区切り の文字列を読み込み、型変換
  5. Go func getI() int { sc.Scan() i, _ := strconv.Atoi(sc.Text())

    return i } func solve() { n := getI() fmt.Fprintln(wr, n) } 実際の利用では関数にして記述量を減らせばそれほど苦ではない
  6. キーの二分探索とは map<int, string> mp { {1, "one"}, {2, "two"}, {5,

    "five"}, {10, "ten"} }; auto it = mp.upper_bound(2); // 2より大きい最初のキーの要素取得 cout << it->first << " => " << it->second << endl; // 5 => five 競プロではこの操作は典型テクニック
  7. Goでツリーマップを使うには AtCoderではgithub.com/liyue201/gostl/ds/map のツリーマップ が使用可能 tree := rbtree.New[int, string](comparator.IntComparator) tree.Insert(1, "one")

    tree.Insert(2, "two") tree.Insert(5, "five") tree.Insert(10, "ten") node := tree.FindUpperBoundNode(2) fmt.Fprintln(wr, node.Key(), node.Value()) // 5 five
  8. bigintが使いにくい import "math/big" func main() { x := big.NewInt(1) for

    i := int64(1); i <= 100; i++ { x.Mul(x, big.NewInt(i)) // x *= i } • 四則演算にAdd, Mulなどを使う(演算 子オーバーロードないので) • 演算実行時、bigintに型変換