🚀

AtCoder Beginner Contest 391(3)

2025/02/06に公開

C問題

何に注目するかが難しく感じました。

package main

import (
	"bufio"
	"fmt"
	"os"
	"strconv"
	"strings"
)

func main() {

	var n, q int
	fmt.Scan(&n, &q)

	reader := bufio.NewReaderSize(os.Stdin, 1<<20)

	// 鳩の居場所 1~n
	pos := make([]int, n+1)

	for i := 1; i <= n; i++ {
		pos[i] = i
	}

	// 巣の中の数 1~n
	cnt := make([]int, n+1)
	for i := 1; i <= n; i++ {
		cnt[i] = 1
	}

	ans := 0

	// クエリを受け取る
	for i := 0; i < q; i++ {
		line, _ := reader.ReadString('\n')
		line = strings.TrimSpace(line)
		s := strings.Split(line, " ")

		// クエリが1の時
		if s[0] == "1" {
			// どの鳩か
			p, _ := strconv.Atoi(s[1])
			// どの巣に移動するか
			h, _ := strconv.Atoi(s[2])

			if cnt[pos[p]] == 2 {
				// 一羽しかいない場合は、巣の中の数を更新
				ans--
			}

			// 鳩の居場所を更新
			cnt[pos[p]]--

			pos[p] = h

			cnt[pos[p]]++

			if cnt[pos[p]] == 2 {
				ans++
			}
		}
		// クエリが2の時
		if s[0] == "2" {
			fmt.Println(ans)
		}

	}

}

Discussion