CF 2149D
收获
- 写题目的时候分配数组要在栈上,使用make分配会很浪费时间
- 默认初始化返回参数 func() (ans int) {}
package main
import (
"fmt"
)
const N = 200005
var (
sum_l [N]int
sum_r [N]int
sum_2_l [N]int
sum_2_r [N]int
)
func solve() {
var n int
var s string
ans := 99999999999
fmt.Scan(&n)
fmt.Scan(&s)
for i := 0; i < n; i++ {
sum_l[i], sum_r[i], sum_2_l[i], sum_2_r[i] = 0, 0, 0, 0
}
if len(s) == 1 {
fmt.Println(0)
return
}
count := 0
if s[0] == 'a' {
count = 1
}
for i := 1; i < n; i++ {
if s[i] == 'a' {
sum_l[i] = sum_l[i-1] + i - count
count++
} else {
sum_l[i] = sum_l[i-1]
}
}
count = 0
if s[n-1] == 'a' {
count = 1
}
for i := n - 2; i >= 0; i-- {
if s[i] == 'a' {
sum_r[i] = sum_r[i+1] + n - (i + 1) - count
count++
} else {
sum_r[i] = sum_r[i+1]
}
}
for i := 0; i < n-1; i++ {
now := sum_l[i] + sum_r[i+1]
if now < ans {
ans = now
}
}
count = 0
if s[0] == 'a' {
count++
}
for i := 1; i < n; i++ {
if s[i] == 'a' {
sum_2_l[i] = sum_2_l[i-1]
count++
} else {
sum_2_l[i] = sum_2_l[i-1] + count
}
}
count = 0
if s[n-1] == 'a' {
count++
}
for i := n - 2; i >= 0; i-- {
if s[i] == 'a' {
sum_2_r[i] = sum_2_r[i+1]
count++
} else {
sum_2_r[i] = sum_2_r[i+1] + count
}
}
for i := 0; i <= n-1; i++ {
now := sum_2_l[i] + sum_2_r[i]
if now < ans {
ans = now
}
}
fmt.Println(ans)
}
func main() {
var t int
fmt.Scan(&t)
for i := 0; i < t; i++ {
solve()
}
}
package main
import (
"fmt"
)
func AbsInt(x int) int {
if x < 0 {
return -x
}
return x
}
func calc(vector []int) int {
if len(vector) == 0 || len(vector) == 1 {
return 0
}
ans := 0
pos := len(vector) / 2
for i := 0; i < len(vector); i++ {
ans += AbsInt(vector[pos]-vector[i]) - AbsInt(pos-i)
}
return ans
}
func solve() {
var n int
var str string
var pos_a []int
var pos_b []int
fmt.Scan(&n, &str)
for i := 0; i < n; i++ {
if str[i] == 'a' {
pos_a = append(pos_a, i)
} else {
pos_b = append(pos_b, i)
}
}
l_ans := calc(pos_a)
r_ans := calc(pos_b)
var ans int
if l_ans > r_ans {
ans = r_ans
} else {
ans = l_ans
}
fmt.Println(ans)
}
func main() {
var t int
fmt.Scan(&t)
for i := 0; i < t; i++ {
solve()
}
}