ACM部分语言快速IO
部分语言的快速 IO
部分题目输入数据量过大,需要使用更高效读入方式才能通过。以下按照热身赛 B 题的需要列出部分语言的快速 IO。
其他语言的 IO 可以参考题目页提交框右上角的“帮助-各种语言程序样例”。
C++
C++ 中的流输入输出默认会与 C 风格的标准输入输出同步,导致性能不佳。同时
cin
和
cout
也存在同步,
cin
读取数据前会先清空
cout
的输出缓冲区。可以在程序最开始使用如下语句取消这两种同步。但应注意之后无法再混用两种输入输出方式。
ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
Java
static BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
static StringTokenizer tokenizer = null;
static String next(){
while (tokenizer == null || !tokenizer.hasMoreTokens()){
try{
tokenizer = new StringTokenizer(reader.readLine());
} catch (IOException e){
throw new RuntimeException(e);
}
}
return tokenizer.nextToken();
}
static int nextInt(){
return Integer.parseInt(next());
}
Python3
Python2 类似。
Python3 使用
input()
或
sys.stdin.readline()
均可。
cas = int(input()) for casi in range(cas): n, m = list(map(int, input().split())) a = list(map(int, input().split()))
Go
与 C++ 类似,
bufio
会将输入预先读入到缓冲区,因此不能与
fmt.Scan
混用。
func ReadLine(reader *bufio.Reader) string { line, _ := reader.ReadString('\n') return strings.TrimRight(line, "\n") } func ReadInt(reader *bufio.Reader) int { num, _ := strconv.Atoi(ReadLine(reader)) return num } func ReadArray(reader *bufio.Reader) []int { line := ReadLine(reader); strs := strings.Split(line, " ") nums := make([]int, len(strs)) for i, s := range strs { nums[i], _ = strconv.Atoi(s) } return nums } reader := bufio.NewReader(os.Stdin)
PHP
$T = fgets(STDIN);
for($t=0;$t<$T;$t++){
list($n, $m) = explode(' ', fgets(STDIN));
$a = explode(' ', fgets(STDIN));
常见错误和技巧
- 本地测试时建议采用命令行文件重定向方式输入测试数据,以尽量和评测环境对齐。手工按行输入测试数据时,IO 的 buffer 无法读取后续数据,行为会与实际评测存在差异。
- 部分题目可以通过对一部分输入数据进行特判得出答案,此时应注意继续将当前这一组输入读取完毕。例如热身赛的 B 题,m 为 0 时答案必为 0,此时应将后续的 n 个整数也读取完毕,否则下一次循环所读取到的 n 和 m 实际为本组数据的 a1 和 a2。
- 注意题目中各种量的上下界,估计最终结果和算法中间结果的大小,使用合适的类型存储。
-
如果发生运行超时的错误,在排除死循环之后,可以根据题目中的数据范围生成极限数据,在本地进行测试。