$30 off During Our Annual Pro Sale. View Details »

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

Avatar for ogataso ogataso
August 18, 2025
540

 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に型変換