結果

問題 No.1234 典型RMQ
ユーザー ccppjsrbccppjsrb
提出日時 2020-09-18 22:08:21
言語 Go
(1.22.1)
結果
AC  
実行時間 438 ms / 2,000 ms
コード長 5,651 bytes
コンパイル時間 14,085 ms
コンパイル使用メモリ 203,196 KB
実行使用メモリ 25,360 KB
最終ジャッジ日時 2023-08-08 18:43:04
合計ジャッジ時間 23,379 ms
ジャッジサーバーID
(参考情報)
judge12 / judge15
このコードへのチャレンジ(β)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 1 ms
4,352 KB
testcase_01 AC 2 ms
4,356 KB
testcase_02 AC 1 ms
4,356 KB
testcase_03 AC 1 ms
4,352 KB
testcase_04 AC 1 ms
4,388 KB
testcase_05 AC 2 ms
4,352 KB
testcase_06 AC 392 ms
25,348 KB
testcase_07 AC 250 ms
10,280 KB
testcase_08 AC 423 ms
25,356 KB
testcase_09 AC 330 ms
16,760 KB
testcase_10 AC 438 ms
25,332 KB
testcase_11 AC 392 ms
25,360 KB
testcase_12 AC 327 ms
16,764 KB
testcase_13 AC 251 ms
10,280 KB
testcase_14 AC 324 ms
16,744 KB
testcase_15 AC 317 ms
16,776 KB
testcase_16 AC 410 ms
25,352 KB
testcase_17 AC 325 ms
16,744 KB
testcase_18 AC 209 ms
8,092 KB
testcase_19 AC 414 ms
25,344 KB
testcase_20 AC 216 ms
23,104 KB
testcase_21 AC 392 ms
25,348 KB
testcase_22 AC 277 ms
25,224 KB
testcase_23 AC 283 ms
25,216 KB
testcase_24 AC 283 ms
25,204 KB
testcase_25 AC 280 ms
25,200 KB
testcase_26 AC 285 ms
25,220 KB
testcase_27 AC 2 ms
4,356 KB
testcase_28 AC 1 ms
4,356 KB
testcase_29 AC 1 ms
4,356 KB
権限があれば一括ダウンロードができます

ソースコード

diff #

package main

import (
	"bufio"
	"fmt"
	"math"
	"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([]SInterface, n)
	for i := 0; i < n; i++ {
		aa[i] = &S{x: getNextInt64(scanner)}
	}
	seg := NewLazySegTreeWithData(aa, E, ID)
	q := getNextInt(scanner)
	for q > 0 {
		q--
		k := getNextInt(scanner)
		l := getNextInt(scanner) - 1
		r := getNextInt(scanner)
		c := getNextInt64(scanner)
		if k == 1 {
			seg.ApplyRange(l, r, &F{x: c})
			continue
		}
		fmt.Fprintln(writer, seg.Prod(l, r).(*S).x)
	}
}

func E() SInterface {
	return &S{x: math.MaxInt64}
}
func ID() FInterface {
	return &F{x: 0}
}

type S struct {
	x int64
}

func (s *S) Op(l, r SInterface) SInterface {
	ll, rr := l.(*S), r.(*S)
	if ll.x < rr.x {
		s.x = ll.x
	} else {
		s.x = rr.x
	}
	return s
}
func (s *S) Mapping(l FInterface, r SInterface) SInterface {
	ll, rr := l.(*F), r.(*S)
	s.x = ll.x + rr.x
	return s
}

type F struct {
	x int64
}

func (f *F) Composition(l, r FInterface) FInterface {
	ll, rr := l.(*F), r.(*F)
	f.x = ll.x + rr.x
	return f
}

// SInterface Type S interface
type SInterface interface {
	Op(SInterface, SInterface) SInterface
	Mapping(FInterface, SInterface) SInterface
}

// FInterface Type F interface
type FInterface interface {
	Composition(FInterface, FInterface) FInterface
}

// LazySegTree is the data structure for monoids
type LazySegTree struct {
	n, size, log int
	e            func() SInterface
	id           func() FInterface
	d            []SInterface
	lz           []FInterface
}

// NewLazySegTree Constructor
func NewLazySegTree(n int, e func() SInterface, id func() FInterface) *LazySegTree {
	a := make([]SInterface, n)
	for i := 0; i < n; i++ {
		a[i] = e()
	}
	return NewLazySegTreeWithData(a, e, id)
}

// NewLazySegTreeWithData Constructor
func NewLazySegTreeWithData(a []SInterface, e func() SInterface, id func() FInterface) *LazySegTree {
	n := len(a)
	log := 0
	for i := n; i > 0; i >>= 1 {
		log++
	}
	size := 1 << log
	d := make([]SInterface, size<<1)
	lz := make([]FInterface, size)
	for i := 0; i < size<<1; i++ {
		d[i] = e()
	}
	for i := 0; i < size; i++ {
		lz[i] = id()
	}
	for i := 0; i < n; i++ {
		d[i+size] = a[i]
	}
	s := LazySegTree{d: d, lz: lz, n: n, size: size, log: log, e: e, id: id}
	for i := size - 1; i > 0; i-- {
		s.update(i)
	}
	return &s
}

// Set assigns x to a[p]
func (s *LazySegTree) Set(p int, x SInterface) {
	p += s.size
	for i := s.log; i > 0; i-- {
		s.push(p >> i)
	}
	s.d[p] = x
	for i := 1; i <= s.log; i++ {
		s.update(p >> i)
	}
}

// Get returns a[p]
func (s *LazySegTree) Get(p int) SInterface {
	p += s.size
	for i := s.log; i > 0; i-- {
		s.push(p >> i)
	}
	return s.d[p]
}

// Prod returns op(a[l], ..., a[r - 1]), assuming the properties of the monoid. It returns e() if l = r.
func (s *LazySegTree) Prod(l, r int) SInterface {
	if l >= r {
		return s.e()
	}
	sml := s.e()
	smr := s.e()
	l += s.size
	r += s.size
	for i := s.log; i > 0; i-- {
		if (l>>i)<<i != l {
			s.push(l >> i)
		}
		if (r>>i)<<i != r {
			s.push(r >> i)
		}
	}
	for l < r {
		if l&1 == 1 {
			sml.Op(sml, s.d[l])
			l++
		}
		if r&1 == 1 {
			r--
			smr.Op(s.d[r], smr)
		}
		l >>= 1
		r >>= 1
	}
	return sml.Op(sml, smr)
}

// AllProd returns op(a[0], ..., a[n - 1]), assuming the properties of the monoid. It returns e() if n = 0.
func (s *LazySegTree) AllProd() SInterface {
	return s.d[1]
}

// Apply applies a[p] = op_st(a[p], x).
func (s *LazySegTree) Apply(p int, f FInterface) {
	p += s.size
	for i := s.log; i > 0; i-- {
		s.push(p >> i)
	}
	s.d[p].Mapping(f, s.d[p])
	for i := 1; i <= s.log; i++ {
		s.update(p >> i)
	}
}

// ApplyRange applies a[p] = op_st(a[p], x) for all i = l..r-1.
func (s *LazySegTree) ApplyRange(l, r int, f FInterface) {
	if l == r {
		return
	}
	l += s.size
	r += s.size
	for i := s.log; i > 0; i-- {
		if (l>>i)<<i != l {
			s.push(l >> i)
		}
		if (r>>i)<<i != r {
			s.push(r >> i)
		}
	}
	ll := l
	rr := r
	for l < r {
		if l&1 == 1 {
			s.allApply(l, f)
			l++
		}
		if r&1 == 1 {
			r--
			s.allApply(r, f)
		}
		l >>= 1
		r >>= 1
	}
	l = ll
	r = rr
	for i := 1; i <= s.log; i++ {
		if (l>>i)<<i != l {
			s.update(l >> i)
		}
		if (r>>i)<<i != r {
			s.update(r >> i)
		}
	}
}
func (s *LazySegTree) update(k int) {
	s.d[k].Op(s.d[k<<1], s.d[k<<1+1])
}
func (s *LazySegTree) allApply(k int, f FInterface) {
	s.d[k].Mapping(f, s.d[k])
	if k < s.size {
		s.lz[k].Composition(f, s.lz[k])
	}
}
func (s *LazySegTree) push(k int) {
	s.allApply(k<<1, s.lz[k])
	s.allApply(k<<1+1, s.lz[k])
	s.lz[k] = s.id()
}
0