【PAST#01】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 }