Skip to content

【PAST#01】E - SNS のログ

問題概要

E - SNS のログ

考え方

N\leq 100, Q\leq 500 なので愚直に計算しても間に合いそう。

AC
package main

import (
    "bufio"
    "fmt"
    "os"
)

var r = bufio.NewReader(os.Stdin)

var N, M int
var MAT [][]rune

func main() {
    N, M = ni(), ni()
    MAT = make([][]rune, N)
    for i := range MAT {
        MAT[i] = make([]rune, N)
        for j := range MAT[i] {
            MAT[i][j] = 'N'
        }
    }
    solve()
}

func solve() {
    for i := 0; i < M; i++ {
        a := ni()
        b := ni() - 1
        switch a {
        case 1:
            c := ni() - 1
            follow(b, c)
        case 2:
            followBackAll(b)
        case 3:
            followFollow(b)
        }
    }

    for i := range MAT {
        fmt.Println(string(MAT[i]))
    }

}

func follow(a, b int) {
    MAT[a][b] = 'Y'
}

func followBackAll(a int) {
    for _, b := range getFollower(a) {
        follow(a, b)
    }
}

func followFollow(a int) {
    for _, e1 := range getFollows(a) {
        for _, e2 := range getFollows(e1) {
            if e2 == a {
                continue
            }
            follow(a, e2)
        }
    }

}

// nをフォローしている人のidxを返す
func getFollower(n int) (ret []int) {
    for i := 0; i < N; i++ {
        if MAT[i][n] == 'Y' {
            ret = append(ret, i)
        }
    }
    return
}

// nがフォローしている人のidxを返す
func getFollows(n int) (ret []int) {
    for i := 0; i < N; i++ {
        if MAT[n][i] == 'Y' {
            ret = append(ret, i)
        }
    }
    return
}

func ni() int { var n int; fmt.Fscan(r, &n); return n }

submission