結果
| 問題 |
No.2148 ひとりUNO
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2022-12-18 12:56:29 |
| 言語 | Go (1.23.4) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 2,561 bytes |
| コンパイル時間 | 12,447 ms |
| コンパイル使用メモリ | 229,208 KB |
| 実行使用メモリ | 8,588 KB |
| 最終ジャッジ日時 | 2024-11-17 23:25:56 |
| 合計ジャッジ時間 | 15,228 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 1 |
| other | AC * 9 WA * 30 |
ソースコード
package main
import (
"bufio"
"fmt"
"os"
"strconv"
)
var sc = bufio.NewScanner(os.Stdin)
var out = bufio.NewWriter(os.Stdout)
func main() {
buf := make([]byte, 1024*1024)
sc.Buffer(buf, bufio.MaxScanTokenSize)
sc.Split(bufio.ScanWords)
t := nextInt()
var ans []string
for i := 0; i < t; i++ {
n := nextInt()
var c []string
var d []int
for i := 0; i < n; i++ {
c = append(c, nextString())
d = append(d, nextInt()-1)
}
ans = append(ans, solve(n, c, d))
}
PrintVertically(ans)
}
func solve(n int, c []string, d []int) string {
m := map[string]int{"R": 2 * n, "G": 2*n + 1, "B": 2*n + 2}
uf := NewUnionFind(2*n + 3)
for i := 0; i < n; i++ {
uf.Unite(i, m[c[i]])
uf.Unite(i, n+d[i])
}
//PrintUnionFind(uf)
ok := true
root := uf.Find(0)
for i := 0; i < n; i++ {
ok = ok && root == uf.Find(i)
}
if ok {
return "YES"
} else {
return "NO"
}
}
type UnionFind struct {
parent []int // parentent numbers
rank []int // height of tree
size []int
}
func New(n int) *UnionFind {
return NewUnionFind(n)
}
func NewUnionFind(n int) *UnionFind {
if n <= 0 {
return nil
}
u := new(UnionFind)
// for accessing index without minus 1
u.parent = make([]int, n+1)
u.rank = make([]int, n+1)
u.size = make([]int, n+1)
for i := 0; i <= n; i++ {
u.parent[i] = i
u.rank[i] = 0
u.size[i] = 1
}
return u
}
func (uf *UnionFind) Find(x int) int {
if uf.parent[x] == x {
return x
} else {
// compress path
// ex. Find(4)
// 1 - 2 - 3 - 4
// 1 - 2
// L-3
// L 4
uf.parent[x] = uf.Find(uf.parent[x])
return uf.parent[x]
}
}
func (uf *UnionFind) Size(x int) int {
return uf.size[uf.Find(x)]
}
func (uf *UnionFind) ExistSameUnion(x, y int) bool {
return uf.Find(x) == uf.Find(y)
}
func (uf *UnionFind) Unite(x, y int) {
x = uf.Find(x)
y = uf.Find(y)
if x == y {
return
}
// rank
if uf.rank[x] < uf.rank[y] {
//yがrootの木にxがrootの木を結合する
uf.parent[x] = y
uf.size[y] += uf.size[x]
} else {
// uf.rank[x] >= uf.rank[y]
//xがrootの木にyがrootの木を結合する
uf.parent[y] = x
uf.size[x] += uf.size[y]
if uf.rank[x] == uf.rank[y] {
uf.rank[x]++
}
}
}
func PrintUnionFind(u *UnionFind) {
// for debuging. not optimize.
fmt.Println(u.parent)
fmt.Println(u.rank)
fmt.Println(u.size)
}
func nextInt() int {
sc.Scan()
i, _ := strconv.Atoi(sc.Text())
return i
}
func nextString() string {
sc.Scan()
return sc.Text()
}
func PrintVertically(x []string) {
defer out.Flush()
for _, v := range x {
fmt.Fprintln(out, v)
}
}