結果
| 問題 | No.877 Range ReLU Query |
| コンテスト | |
| ユーザー |
sgsw
|
| 提出日時 | 2021-08-12 23:41:25 |
| 言語 | Go (1.23.4) |
| 結果 |
AC
|
| 実行時間 | 861 ms / 2,000 ms |
| コード長 | 3,715 bytes |
| 記録 | |
| コンパイル時間 | 14,476 ms |
| コンパイル使用メモリ | 223,828 KB |
| 実行使用メモリ | 42,624 KB |
| 最終ジャッジ日時 | 2024-11-08 10:38:47 |
| 合計ジャッジ時間 | 23,332 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 1 |
| other | AC * 20 |
ソースコード
package main
import (
"bufio"
"fmt"
"os"
"sort"
"strconv"
)
var wg = bufio.NewScanner(os.Stdin)
const (
inf = int(1e18)
initialBufSize = int(1e6)
maxBufSize = int(1e6)
)
var buf []byte = make([]byte, initialBufSize)
// greatest common divisor (GCD) via Euclidean algorithm
func GCD(a, b int) int {
for b != 0 {
t := b
b = a % b
a = t
}
return a
}
func init() {
wg.Split(bufio.ScanWords)
wg.Buffer(buf, maxBufSize)
}
func nextInt() int {
wg.Scan()
i, e := strconv.Atoi(wg.Text())
if e != nil {
panic(e)
}
return i
}
/*
Monoid-Structure should be decleared some-where else.
-> op(Monoid,Monoid)Monoid & ide()Monoid is required.
*/
type Monoid interface {
get() interface{}
op(Monoid) Monoid
ide() Monoid
}
type SegTree struct {
op func(Monoid) Monoid /* op */
e func() Monoid /*identity*/
d []Monoid
_d []Monoid
n int /* size*/
log int
size int
}
func Gen(monoid Monoid, n interface{}) (SegTree, bool) {
seg := SegTree{op: monoid.op, e: monoid.ide, d: []Monoid{}, _d: []Monoid{}, n: 0, log: 0, size: 0}
collect := true
switch T := n.(type) {
case int:
seg.d = make([]Monoid, n.(int))
for i := range seg.d {
seg.d[i] = seg.e()
}
case []Monoid:
_ = T
seg.d = make([]Monoid, len(n.([]Monoid)))
copy(seg.d, n.([]Monoid))
default:
collect = false
return seg, collect
}
seg.n = len(seg.d)
for ord := 0; (1 << ord) < seg.n; {
ord++
seg.log = ord
}
seg.size = 1 << seg.log
seg._d = make([]Monoid, 2*seg.size)
for i := range seg._d {
seg._d[i] = seg.e()
}
for i := 0; i < seg.n; i++ {
seg._d[seg.size+i] = seg.d[i]
}
for i := seg.size - 1; i > 0; i-- {
seg._update(i)
}
return seg, collect
}
func (seg SegTree) _update(k int) {
seg._d[k] = seg._d[2*k].op(seg._d[2*k+1])
}
func (seg SegTree) Set(p int, x Monoid) {
//a[p] -> x
p += seg.size
seg._d[p] = x
for i := 1; i <= seg.log; i++ {
seg._update(p >> i)
}
}
func (seg SegTree) Get(p int) Monoid {
// a[p]
return seg._d[p+seg.size]
}
func (seg SegTree) OverWrite(p int, f func(Monoid) Monoid) {
p += seg.size
m := seg._d[p]
seg._d[p] = f(m)
for i := 1; i <= seg.log; i++ {
seg._update(p >> i)
}
}
func (seg SegTree) Prod(l, r int) Monoid {
//op(a[l..r))
sml := seg.e()
smr := seg.e()
l += seg.size
r += seg.size
for l < r {
if l&1 == 1 {
sml = sml.op(seg._d[l])
l++
}
if r&1 == 1 {
r--
smr = seg._d[r].op(smr)
}
l >>= 1
r >>= 1
}
return sml.op(smr)
}
func (seg SegTree) All_prod() Monoid {
return seg._d[1]
}
//独自のモノイド定義
type monoid struct {
sum int
cnt int
}
func (m monoid) get() interface{} {
return m
}
func (x monoid) op(y Monoid) Monoid {
a := x.get().(monoid)
b := y.get().(monoid)
return monoid{a.sum + b.sum, a.cnt + b.cnt}
}
func (m monoid) ide() Monoid {
return monoid{0, 0}
}
type query struct {
l, r, val, idx int
}
type pair struct {
val, idx int
}
func main() {
n, q := nextInt(), nextInt()
a := make([]pair, n)
Q := make([]query, q)
for i := 0; i < n; i++ {
a[i] = pair{nextInt(), i}
}
seg, _ := Gen(monoid{}, n)
for i := 0; i < q; i++ {
_, l, r, val := nextInt(), nextInt(), nextInt(), nextInt()
l--
r--
Q[i] = query{l, r, val, i}
}
sort.Slice(Q, func(i, j int) bool {
return Q[i].val > Q[j].val
})
sort.Slice(a, func(i, j int) bool {
return a[i].val > a[j].val
})
ans := make([]int, q)
for itr, i := 0, 0; i < q; i++ {
for itr < n && a[itr].val >= Q[i].val {
seg.Set(a[itr].idx, monoid{a[itr].val, 1})
itr++
}
l, r, val, idx := Q[i].l, Q[i].r, Q[i].val, Q[i].idx
m := seg.Prod(l, r+1).(monoid)
ans[idx] = m.sum - val*m.cnt
}
for i := 0; i < q; i++ {
fmt.Printf("%d\n", ans[i])
}
}
sgsw