結果
問題 | No.318 学学学学学 |
ユーザー | ccppjsrb |
提出日時 | 2020-09-05 09:54:59 |
言語 | Go (1.22.1) |
結果 |
WA
|
実行時間 | - |
コード長 | 7,149 bytes |
コンパイル時間 | 15,381 ms |
コンパイル使用メモリ | 243,940 KB |
実行使用メモリ | 15,900 KB |
最終ジャッジ日時 | 2024-11-27 20:14:33 |
合計ジャッジ時間 | 20,222 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge2 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 13 ms
5,248 KB |
testcase_01 | AC | 27 ms
5,248 KB |
testcase_02 | WA | - |
testcase_03 | AC | 22 ms
5,248 KB |
testcase_04 | WA | - |
testcase_05 | WA | - |
testcase_06 | WA | - |
testcase_07 | AC | 173 ms
9,856 KB |
testcase_08 | AC | 118 ms
8,960 KB |
testcase_09 | AC | 92 ms
7,808 KB |
testcase_10 | AC | 62 ms
6,656 KB |
testcase_11 | WA | - |
testcase_12 | WA | - |
testcase_13 | WA | - |
testcase_14 | WA | - |
testcase_15 | WA | - |
testcase_16 | WA | - |
testcase_17 | AC | 93 ms
10,368 KB |
testcase_18 | AC | 95 ms
10,240 KB |
testcase_19 | AC | 92 ms
10,496 KB |
testcase_20 | WA | - |
testcase_21 | AC | 1 ms
5,248 KB |
testcase_22 | AC | 2 ms
5,248 KB |
testcase_23 | AC | 1 ms
5,248 KB |
testcase_24 | AC | 2 ms
5,248 KB |
testcase_25 | AC | 1 ms
5,248 KB |
testcase_26 | AC | 2 ms
5,248 KB |
testcase_27 | AC | 1 ms
5,248 KB |
testcase_28 | AC | 1 ms
5,248 KB |
ソースコード
package main import ( "bufio" "fmt" "os" "strconv" ) func configure(scanner *bufio.Scanner) { scanner.Split(bufio.ScanWords) scanner.Buffer(make([]byte, 1000005), 1000005) } func getNextString(scanner *bufio.Scanner) string { scanned := scanner.Scan() if !scanned { panic("scan failed") } return scanner.Text() } func getNextInt(scanner *bufio.Scanner) int { i, _ := strconv.Atoi(getNextString(scanner)) return i } func getNextInt64(scanner *bufio.Scanner) int64 { i, _ := strconv.ParseInt(getNextString(scanner), 10, 64) return i } func getNextFloat64(scanner *bufio.Scanner) float64 { i, _ := strconv.ParseFloat(getNextString(scanner), 64) return i } func main() { fp := os.Stdin wfp := os.Stdout extra := 0 if os.Getenv("I") == "IronMan" { fp, _ = os.Open(os.Getenv("END_GAME")) extra = 100 } scanner := bufio.NewScanner(fp) configure(scanner) writer := bufio.NewWriter(wfp) defer func() { r := recover() if r != nil { fmt.Fprintln(writer, r) } writer.Flush() }() solve(scanner, writer) for i := 0; i < extra; i++ { fmt.Fprintln(writer, "-----------------------------------") solve(scanner, writer) } } func solve(scanner *bufio.Scanner, writer *bufio.Writer) { n := getNextInt(scanner) aa := make([]int, n) t := newTreeWithIntComparator() for i := 0; i < n; i++ { aa[i] = getNextInt(scanner) p, found := t.Get(aa[i]) if found { t.Put(aa[i], pair{min(p.(pair)[0], i), max(p.(pair)[1], i)}) continue } t.Put(aa[i], pair{i, i}) } bb := make([]int, n) for !t.Empty() { p := t.Right() l := p.Value.(pair)[0] r := p.Value.(pair)[1] for l <= r && bb[l] == 0 { bb[l] = p.Key.(int) l++ } for l <= r && bb[r] == 0 { bb[r] = p.Key.(int) r-- } t.Remove(p.Key.(int)) } fmt.Fprint(writer, bb[0]) for i := 1; i < n; i++ { fmt.Fprintf(writer, " %d", bb[i]) } fmt.Fprintln(writer, "") } type pair [2]int func min(a, b int) int { if a < b { return a } return b } func max(a, b int) int { return -min(-a, -b) } type tree struct { Root *node Comparator func(a, b interface{}) int } type node struct { Left, Right, Parent *node Key interface{} Value interface{} size int } func newTreeWithIntComparator() *tree { return newTree(func(a, b interface{}) int { aa := a.(int) bb := b.(int) if aa == bb { return 0 } if aa < bb { return -1 } return 1 }) } func newTree(comparator func(interface{}, interface{}) int) *tree { return &tree{Root: nil, Comparator: comparator} } func newNode(parent *node, key, value interface{}) *node { return &node{Parent: parent, Key: key, Value: value, size: 1} } func (n *node) IsRoot() bool { return n.Parent == nil } func (n *node) IsLeft() bool { return !n.IsRoot() && n.Parent.Left == n } func (n *node) IsRight() bool { return !n.IsRoot() && n.Parent.Right == n } func (n *node) Update() { n.size = 1 + n.Left.Size() + n.Right.Size() } func (n *node) Size() int { if n == nil { return 0 } return n.size } func (n *node) Merge(m *node) *node { if n == nil { return m } if m == nil { return n } if n.Size() > m.Size() { n.AppendRight(n.Right.Merge(m)) n.Update() return n } m.AppendLeft(n.Merge(m.Left)) m.Update() return m } func (n *node) MaximumNode() *node { if n == nil { return n } if n.Right == nil { return n } return n.Right.MaximumNode() } func (n *node) MinimumNode() *node { if n == nil { return n } if n.Left == nil { return n } return n.Left.MinimumNode() } func (n *node) AppendLeft(m *node) { if n == nil { return } n.Left = m n.Update() if m == nil { return } m.Parent = n } func (n *node) AppendRight(m *node) { if n == nil { return } n.Right = m n.Update() if m == nil { return } m.Parent = n } func (t *tree) Put(key, value interface{}) { if t.Root == nil { t.Root = newNode(nil, key, value) return } now := t.Root for { compared := t.Comparator(key, now.Key) switch { case compared == 0: now.Value = value return case compared < 0: if now.Left == nil { now.Left = newNode(now, key, value) t.Update(now) return } now = now.Left case compared > 0: if now.Right == nil { now.Right = newNode(now, key, value) t.Update(now) return } now = now.Right } } } func (t *tree) Get(key interface{}) (interface{}, bool) { now := t.Lookup(key) if now == nil { return nil, false } return now.Value, true } func (t *tree) Lookup(key interface{}) *node { now := t.Root for now != nil { compared := t.Comparator(key, now.Key) switch { case compared == 0: return now case compared < 0: now = now.Left case compared > 0: now = now.Right } } return nil } func (t *tree) Remove(key interface{}) { now := t.Lookup(key) if now == nil { return } parent := now.Parent partialTree := now.Left.Merge(now.Right) switch { case now.IsRoot(): t.Root = partialTree if t.Root != nil { t.Root.Parent = nil } case now.IsLeft(): parent.AppendLeft(partialTree) case now.IsRight(): parent.AppendRight(partialTree) } for parent != nil { parent.Update() parent = parent.Parent } } func (t *tree) Update(now *node) { for now != nil { now.Update() parent := now.Parent switch { case now.Left.Size() > now.Right.Size(): t.RotateRight(now.Left) case now.Left.Size() < now.Right.Size(): t.RotateLeft(now.Right) } now = parent } } func (t *tree) RotateLeft(now *node) { parent := now.Parent grand := parent.Parent parent.AppendRight(now.Left) now.AppendLeft(parent) switch { case grand == nil: t.Root = now now.Parent = nil case grand.Left == parent: grand.AppendLeft(now) case grand.Right == parent: grand.AppendRight(now) } } func (t *tree) RotateRight(now *node) { parent := now.Parent grand := parent.Parent parent.AppendLeft(now.Right) now.AppendRight(parent) switch { case grand == nil: t.Root = now t.Root.Update() now.Parent = nil case grand.Left == parent: grand.AppendLeft(now) case grand.Right == parent: grand.AppendRight(now) } } func (t *tree) Right() *node { return t.Root.MaximumNode() } func (t *tree) Left() *node { return t.Root.MinimumNode() } func (t *tree) Floor(key interface{}) (*node, bool) { now := t.Root var n *node for now != nil { compared := t.Comparator(key, now.Key) switch { case compared == 0: return now, true case compared < 0: now = now.Left case compared > 0: n = now now = now.Right } } return n, n != nil } func (t *tree) Ceiling(key interface{}) (*node, bool) { now := t.Root var n *node for now != nil { compared := t.Comparator(key, now.Key) switch { case compared == 0: return now, true case compared < 0: n = now now = now.Left case compared > 0: now = now.Right } } return n, n != nil } func (t *tree) Empty() bool { return t.Root == nil } func (t *tree) At(i int) (*node, bool) { var n *node now := t.Root for now != nil && i > 0 { if i <= now.Left.Size() { now = now.Left continue } i -= now.Left.Size() + 1 if i <= 0 { n = now } now = now.Right } return n, n != nil }