前言
- 本篇分享介绍了3个版本
- 接下来以 T796.子矩阵的和 为例
Ver.1
使用&结果
fmt.Scan() 和 fmt.Print()
系列- 结果:
TLE
code
package main
import (
"fmt"
)
const N = 1010
func main() {
var n, m, q int
fmt.Scan(&n, &m, &q)
a := make([][N]int, N)
for i := 1; i <= n; i++ {
for j := 1; j <= m; j++ {
fmt.Scan(&a[i][j])
a[i][j] += a[i-1][j] + a[i][j-1] - a[i-1][j-1]
}
}
var x1, y1, x2, y2 int
for ; q != 0; q-- {
fmt.Scan(&x1, &y1, &x2, &y2)
res := a[x2][y2] - a[x1-1][y2] - a[x2][y1-1] + a[x1-1][y1-1]
fmt.Println(res)
}
}
Ver.2
使用&结果
bufio.NewWriter & bufio.NewReader
配套的Fscan&Fprint
系列- 结果:
4296ms
code
package main
import (
"bufio"
"fmt"
"os"
)
const N = 1010
func main() {
defer ot.Flush()
var n, m, q int
fmt.Fscan(in, &n, &m, &q)
a := make([][N]int, N)
for i := 1; i <= n; i++ {
for j := 1; j <= m; j++ {
fmt.Fscan(in, &a[i][j])
a[i][j] += a[i-1][j] + a[i][j-1] - a[i-1][j-1]
}
}
var x1, y1, x2, y2 int
for ; q != 0; q-- {
fmt.Fscan(in, &x1, &y1, &x2, &y2)
res := a[x2][y2] - a[x1-1][y2] - a[x2][y1-1] + a[x1-1][y1-1]
fmt.Fprintln(ot, res)
}
}
const BUFSIZE = int(1e6)
var (
ot = bufio.NewWriterSize(os.Stdout, BUFSIZE)
in = bufio.NewReader(os.Stdin)
)
Ver.3
借鉴自atcoder的一位 大哥
使用&结果
- 使用
bufio.NewScanner()
- 结果:仅仅
840ms
如何使用
rn
3个函数,是读单个数字或字符串;
code
package main
import (
"bufio"
"fmt"
"os"
"strconv"
)
const N = 1010
func main() {
defer ot.Flush()
n, m, q := rnI(), rnI(), rnI()
a := make([][N]int, N)
for i := 1; i <= n; i++ {
for j := 1; j <= m; j++ {
a[i][j] = rnI()
a[i][j] += a[i-1][j] + a[i][j-1] - a[i-1][j-1]
}
}
for ; q != 0; q-- {
x1, y1, x2, y2 := rnI(), rnI(), rnI(), rnI()
res := a[x2][y2] - a[x1-1][y2] - a[x2][y1-1] + a[x1-1][y1-1]
fmt.Fprintln(ot, res)
}
}
//{{{
var (
ot = bufio.NewWriter(os.Stdout)
in = bufio.NewScanner(os.Stdin)
)
func init() { in.Split(bufio.ScanWords) }
func rnS() string { in.Scan(); return in.Text() }
func rnI() int { i, _ := strconv.Atoi(rnS()); return i }
func rnF() float64 { f, _ := strconv.ParseFloat(rnS(), 64); return f }
//}}}
注意
- 在高精度的几个题目,用Ver3会出现奇怪的问题,导致不能AC. 但是在洛谷中是ok的。可能跟评测机go的版本有关系吧
这样读入二维切片有没有优化呢
是有优化的。最明显的是:试试大量输入输出的算法题,不会超时了。
init() 是啥作用呢
“init函数先于main函数自动执行“
谢谢同学
真的好屌,优化一下比C++还快
非常有用!感谢分享!!!
爱了爱了
对大家有帮助就行hh