Submission #1186675


Source Code Expand

package main

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

type Io struct {
	reader    *bufio.Reader
	writer    *bufio.Writer
	tokens    []string
	nextToken int
}

func NewIo() *Io {
	return &Io{
		reader: bufio.NewReader(os.Stdin),
		writer: bufio.NewWriter(os.Stdout),
	}
}

func (io *Io) Flush() {
	err := io.writer.Flush()
	if err != nil {
		panic(err)
	}
}

func (io *Io) NextLine() string {
	var buffer []byte
	for {
		line, isPrefix, err := io.reader.ReadLine()
		if err != nil {
			panic(err)
		}
		buffer = append(buffer, line...)
		if !isPrefix {
			break
		}
	}
	return string(buffer)
}

func (io *Io) Next() string {
	for io.nextToken >= len(io.tokens) {
		line := io.NextLine()
		io.tokens = strings.Fields(line)
		io.nextToken = 0
	}
	r := io.tokens[io.nextToken]
	io.nextToken++
	return r
}

func (io *Io) NextInt() int {
	i, err := strconv.Atoi(io.Next())
	if err != nil {
		panic(err)
	}
	return i
}

func (io *Io) NextFloat() float64 {
	i, err := strconv.ParseFloat(io.Next(), 64)
	if err != nil {
		panic(err)
	}
	return i
}

func (io *Io) PrintLn(a ...interface{}) {
	fmt.Fprintln(io.writer, a...)
}

func (io *Io) Printf(format string, a ...interface{}) {
	fmt.Fprintf(io.writer, format, a...)
}

func (io *Io) PrintIntLn(a []int) {
	b := []interface{}{}
	for _, x := range a {
		b = append(b, x)
	}
	io.PrintLn(b...)
}

func (io *Io) PrintStringLn(a []string) {
	b := []interface{}{}
	for _, x := range a {
		b = append(b, x)
	}
	io.PrintLn(b...)
}

func Log(name string, value interface{}) {
	fmt.Fprintf(os.Stderr, "%s=%+v\n", name, value)
}

func intMin(a, b int) int {
	if a < b {
		return a
	}
	return b
}

func intMax(a, b int) int {
	if a > b {
		return a
	}
	return b
}

// argument: X
// min [0, k) < X となる最小のkを返す関数を作る
const (
	sqrtN = 512
	INF   = 1000000000
)

type SqrtDecomposition struct {
	N        int
	K        int
	data     []int
	blockMin []int
}

func NewSqrtDecomposition(n int) *SqrtDecomposition {
	k := (n + sqrtN - 1) / sqrtN
	sq := &SqrtDecomposition{
		N:        n,
		K:        k,
		data:     make([]int, k*sqrtN),
		blockMin: make([]int, k),
	}
	for i := 0; i < len(sq.data); i++ {
		sq.data[i] = -1
	}
	for i := 0; i < len(sq.blockMin); i++ {
		sq.blockMin[i] = -1
	}
	return sq
}

func (sq *SqrtDecomposition) Update(x, y int) {
	k := x / sqrtN
	sq.data[x] = y
	minval := INF
	for i := k * sqrtN; i < (k+1)*sqrtN; i++ {
		minval = intMin(minval, sq.data[i])
	}
	sq.blockMin[k] = minval
}

func (sq *SqrtDecomposition) Find(x int) int {
	for k := 0; k < sq.K; k++ {
		if sq.blockMin[k] < x {
			for i := k * sqrtN; i < (k+1)*sqrtN; i++ {
				if sq.data[i] < x {
					return i
				}
			}
		}
	}
	return -1
}

func main() {
	io := NewIo()
	defer io.Flush()
	N := io.NextInt()
	C := make([]int, N)
	A := make([]int, N)
	for i := 1; i < N; i++ {
		C[i] = io.NextInt()
		A[i] = io.NextInt()
	}
	grundy := make([]int, N)
	grundy[0] = 0
	//index := make([]int, N)
	//index[0] = 0
	//for i := 1; i < N; i++ {
	//	index[i] = -1
	//}
	//for i := 1; i < N; i++ {
	//	for k := 0; k < N; k++ {
	//		if i - C[i] <= index[k] {
	//			// do nothing
	//		} else {
	//			grundy[i] = k
	//			break
	//		}
	//	}
	//	index[grundy[i]] = i
	//}
	sq := NewSqrtDecomposition(N)
	sq.Update(0, 0)
	for i := 1; i < N; i++ {
		grundy[i] = sq.Find(i - C[i])
		//Log("grundy[i]", grundy[i])
		sq.Update(grundy[i], i)
	}
	//Log("C", C)
	//Log("grundy", grundy)
	xor := 0
	for i := 0; i < N; i++ {
		if A[i]%2 == 1 {
			xor = xor ^ grundy[i]
		}
	}
	if xor == 0 {
		io.PrintLn("Second")
	} else {
		io.PrintLn("First")
	}
}

Submission Info

Submission Time
Task C - 茶碗と豆
User arosh
Language Go (1.6)
Score 104
Code Size 3798 Byte
Status AC
Exec Time 217 ms
Memory 6400 KB

Judge Result

Set Name Sample Dataset1 Dataset2 Dataset3
Score / Max Score 0 / 0 80 / 80 20 / 20 4 / 4
Status
AC × 3
AC × 13
AC × 21
AC × 29
Set Name Test Cases
Sample sample-01.txt, sample-02.txt, sample-03.txt
Dataset1 sample-01.txt, sample-02.txt, sample-03.txt, 01-01.txt, 01-02.txt, 01-03.txt, 01-04.txt, 01-05.txt, 01-06.txt, 01-07.txt, 01-08.txt, 01-09.txt, 01-10.txt
Dataset2 sample-01.txt, sample-02.txt, sample-03.txt, 01-01.txt, 01-02.txt, 01-03.txt, 01-04.txt, 01-05.txt, 01-06.txt, 01-07.txt, 01-08.txt, 01-09.txt, 01-10.txt, 02-01.txt, 02-02.txt, 02-03.txt, 02-04.txt, 02-05.txt, 02-06.txt, 02-07.txt, 02-08.txt
Dataset3 01-01.txt, 01-02.txt, 01-03.txt, 01-04.txt, 01-05.txt, 01-06.txt, 01-07.txt, 01-08.txt, 01-09.txt, 01-10.txt, 02-01.txt, 02-02.txt, 02-03.txt, 02-04.txt, 02-05.txt, 02-06.txt, 02-07.txt, 02-08.txt, 03-01.txt, 03-02.txt, 03-03.txt, 03-04.txt, 03-05.txt, 03-06.txt, 03-07.txt, 03-08.txt, sample-01.txt, sample-02.txt, sample-03.txt
Case Name Status Exec Time Memory
01-01.txt AC 1 ms 640 KB
01-02.txt AC 1 ms 640 KB
01-03.txt AC 1 ms 640 KB
01-04.txt AC 1 ms 640 KB
01-05.txt AC 1 ms 640 KB
01-06.txt AC 1 ms 640 KB
01-07.txt AC 1 ms 640 KB
01-08.txt AC 1 ms 640 KB
01-09.txt AC 1 ms 640 KB
01-10.txt AC 1 ms 640 KB
02-01.txt AC 1 ms 640 KB
02-02.txt AC 1 ms 640 KB
02-03.txt AC 1 ms 640 KB
02-04.txt AC 1 ms 640 KB
02-05.txt AC 1 ms 640 KB
02-06.txt AC 1 ms 640 KB
02-07.txt AC 1 ms 640 KB
02-08.txt AC 1 ms 640 KB
03-01.txt AC 208 ms 6400 KB
03-02.txt AC 208 ms 5632 KB
03-03.txt AC 208 ms 5888 KB
03-04.txt AC 208 ms 5888 KB
03-05.txt AC 217 ms 5632 KB
03-06.txt AC 216 ms 5632 KB
03-07.txt AC 133 ms 6272 KB
03-08.txt AC 133 ms 6272 KB
sample-01.txt AC 1 ms 640 KB
sample-02.txt AC 1 ms 640 KB
sample-03.txt AC 1 ms 640 KB