-
Notifications
You must be signed in to change notification settings - Fork 513
/
c.go
100 lines (91 loc) · 1.53 KB
/
c.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
package main
import (
"bufio"
. "fmt"
"io"
"os"
)
// github.com/EndlessCheng/codeforces-go
func run(_r io.Reader, _w io.Writer) {
in := bufio.NewReader(_r)
out := bufio.NewWriter(_w)
defer out.Flush()
var n int
Fscan(in, &n)
a := make([]int, n)
for i := range a {
Fscan(in, &a[i])
}
type pair struct{ v, i int }
posL := make([]int, n)
s := []pair{{0, -1}}
for i, v := range a {
for {
if top := s[len(s)-1]; top.v <= v {
posL[i] = top.i
break
}
s = s[:len(s)-1]
}
s = append(s, pair{v, i})
}
posR := make([]int, n)
s = []pair{{0, n}}
for i := n - 1; i >= 0; i-- {
v := a[i]
for {
if top := s[len(s)-1]; top.v <= v {
posR[i] = top.i
break
}
s = s[:len(s)-1]
}
s = append(s, pair{v, i})
}
sl := make([]int, n)
sl[0] = a[0]
for i := 1; i < n; i++ {
l := posL[i]
sl[i] = a[i] * (i-l)
if l >= 0 {
sl[i] += sl[l]
}
}
sr := make([]int, n)
sr[n-1] = a[n-1]
for i := n - 2; i >= 0; i-- {
r := posR[i]
sr[i] = a[i] * (r-i)
if r < n {
sr[i] += sr[r]
}
}
maxS, maxI := 0, 0
for i, v := range a {
if sum := sl[i] + sr[i] - v; sum > maxS {
maxS, maxI = sum, i
}
}
ans := make([]int, n)
curMax := a[maxI]
for j := maxI; j >= 0; j-- {
curMax = min(curMax, a[j])
ans[j] = curMax
}
curMax = a[maxI]
for j := maxI + 1; j < n; j++ {
curMax = min(curMax, a[j])
ans[j] = curMax
}
for _, v := range ans {
Fprint(out, v, " ")
}
Fprintln(out)
}
func main() { run(os.Stdin, os.Stdout) }
func min(a, b int) int {
if a < b {
return a
}
return b
}