Skip to content

Commit 0103480

Browse files
committed
add FastIO
1 parent cadb741 commit 0103480

File tree

4 files changed

+363
-0
lines changed

4 files changed

+363
-0
lines changed

ContestIO/ContestPrinter.java

Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
1+
class ContestPrinter extends java.io.PrintWriter{
2+
public ContestPrinter(java.io.PrintStream stream){
3+
super(stream);
4+
}
5+
public ContestPrinter(){
6+
super(System.out);
7+
}
8+
9+
private static String dtos(double x, int n) {
10+
StringBuilder sb = new StringBuilder();
11+
if(x < 0){
12+
sb.append('-');
13+
x = -x;
14+
}
15+
x += Math.pow(10, -n)/2;
16+
sb.append((long)x);
17+
sb.append(".");
18+
x -= (long)x;
19+
for(int i = 0;i < n;i++){
20+
x *= 10;
21+
sb.append((int)x);
22+
x -= (int)x;
23+
}
24+
return sb.toString();
25+
}
26+
27+
@Override
28+
public void print(float f){
29+
super.print(dtos(f, 20));
30+
}
31+
@Override
32+
public void println(float f){
33+
super.println(dtos(f, 20));
34+
}
35+
@Override
36+
public void print(double d){
37+
super.print(dtos(d, 20));
38+
}
39+
@Override
40+
public void println(double d){
41+
super.println(dtos(d, 20));
42+
}
43+
44+
45+
46+
public void printArray(int[] array, String separator){
47+
int n = array.length;
48+
for(int i=0; i<n-1; i++){
49+
super.print(array[i]);
50+
super.print(separator);
51+
}
52+
super.println(array[n-1]);
53+
}
54+
public void printArray(int[] array){
55+
this.printArray(array, " ");
56+
}
57+
public void printArray(int[] array, String separator, java.util.function.IntUnaryOperator map){
58+
int n = array.length;
59+
for(int i=0; i<n-1; i++){
60+
super.print(map.applyAsInt(array[i]));
61+
super.print(separator);
62+
}
63+
super.println(array[n-1]);
64+
}
65+
public void printArray(int[] array, java.util.function.IntUnaryOperator map){
66+
this.printArray(array, map);
67+
}
68+
69+
public void printArray(long[] array, String separator){
70+
int n = array.length;
71+
for(int i=0; i<n-1; i++){
72+
super.print(array[i]);
73+
super.print(separator);
74+
}
75+
super.println(array[n-1]);
76+
}
77+
public void printArray(long[] array){
78+
this.printArray(array, " ");
79+
}
80+
public void printArray(long[] array, String separator, java.util.function.LongUnaryOperator map){
81+
int n = array.length;
82+
for(int i=0; i<n-1; i++){
83+
super.print(map.applyAsLong(array[i]));
84+
super.print(separator);
85+
}
86+
super.println(array[n-1]);
87+
}
88+
public void printArray(long[] array, java.util.function.IntUnaryOperator map){
89+
this.printArray(array, map);
90+
}
91+
92+
}

ContestIO/ContestScanner.java

Lines changed: 146 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,146 @@
1+
class ContestScanner{
2+
private final java.io.InputStream in;
3+
private final byte[] buffer = new byte[1024];
4+
private int ptr = 0;
5+
private int buflen = 0;
6+
public ContestScanner(java.io.InputStream in){
7+
this.in = in;
8+
}
9+
public ContestScanner(){
10+
this(System.in);
11+
}
12+
13+
private boolean hasNextByte() {
14+
if (ptr < buflen) {
15+
return true;
16+
}else{
17+
ptr = 0;
18+
try {
19+
buflen = in.read(buffer);
20+
} catch (java.io.IOException e) {
21+
e.printStackTrace();
22+
}
23+
if (buflen <= 0) {
24+
return false;
25+
}
26+
}
27+
return true;
28+
}
29+
private int readByte() {
30+
if (hasNextByte()) return buffer[ptr++]; else return -1;
31+
}
32+
private static boolean isPrintableChar(int c) {
33+
return 33 <= c && c <= 126;
34+
}
35+
public boolean hasNext() {
36+
while(hasNextByte() && !isPrintableChar(buffer[ptr])) ptr++;
37+
return hasNextByte();
38+
}
39+
public String next() {
40+
if (!hasNext()) throw new java.util.NoSuchElementException();
41+
StringBuilder sb = new StringBuilder();
42+
int b = readByte();
43+
while(isPrintableChar(b)) {
44+
sb.appendCodePoint(b);
45+
b = readByte();
46+
}
47+
return sb.toString();
48+
}
49+
50+
public long nextLong() {
51+
if (!hasNext()) throw new java.util.NoSuchElementException();
52+
long n = 0;
53+
boolean minus = false;
54+
int b = readByte();
55+
if (b == '-') {
56+
minus = true;
57+
b = readByte();
58+
}
59+
if (b < '0' || '9' < b) {
60+
throw new NumberFormatException();
61+
}
62+
while(true){
63+
if ('0' <= b && b <= '9') {
64+
n *= 10;
65+
n += b - '0';
66+
}else if(b == -1 || !isPrintableChar(b)){
67+
return minus ? -n : n;
68+
}else{
69+
throw new NumberFormatException();
70+
}
71+
b = readByte();
72+
}
73+
}
74+
public int nextInt() {
75+
long nl = nextLong();
76+
if (nl < Integer.MIN_VALUE || nl > Integer.MAX_VALUE) throw new NumberFormatException();
77+
return (int) nl;
78+
}
79+
public double nextDouble() {
80+
return Double.parseDouble(next());
81+
}
82+
83+
public long[] nextLongArray(int length){
84+
long[] array = new long[length];
85+
for(int i=0; i<length; i++) array[i] = this.nextLong();
86+
return array;
87+
}
88+
public long[] nextLongArray(int length, java.util.function.LongUnaryOperator map){
89+
long[] array = new long[length];
90+
for(int i=0; i<length; i++) array[i] = map.applyAsLong(this.nextLong());
91+
return array;
92+
}
93+
public int[] nextIntArray(int length){
94+
int[] array = new int[length];
95+
for(int i=0; i<length; i++) array[i] = this.nextInt();
96+
return array;
97+
}
98+
public int[] nextIntArray(int length, java.util.function.IntUnaryOperator map){
99+
int[] array = new int[length];
100+
for(int i=0; i<length; i++) array[i] = map.applyAsInt(this.nextInt());
101+
return array;
102+
}
103+
public double[] nextDoubleArray(int length){
104+
double[] array = new double[length];
105+
for(int i=0; i<length; i++) array[i] = this.nextDouble();
106+
return array;
107+
}
108+
public double[] nextDoubleArray(int length, java.util.function.DoubleUnaryOperator map){
109+
double[] array = new double[length];
110+
for(int i=0; i<length; i++) array[i] = map.applyAsDouble(this.nextDouble());
111+
return array;
112+
}
113+
114+
public long[][] nextLongMatrix(int height, int width){
115+
long[][] mat = new long[height][width];
116+
for(int h=0; h<height; h++) for(int w=0; w<width; w++){
117+
mat[h][w] = this.nextLong();
118+
}
119+
return mat;
120+
}
121+
public int[][] nextIntMatrix(int height, int width){
122+
int[][] mat = new int[height][width];
123+
for(int h=0; h<height; h++) for(int w=0; w<width; w++){
124+
mat[h][w] = this.nextInt();
125+
}
126+
return mat;
127+
}
128+
public double[][] nextDoubleMatrix(int height, int width){
129+
double[][] mat = new double[height][width];
130+
for(int h=0; h<height; h++) for(int w=0; w<width; w++){
131+
mat[h][w] = this.nextDouble();
132+
}
133+
return mat;
134+
}
135+
136+
public char[][] nextCharMatrix(int height, int width){
137+
char[][] mat = new char[height][width];
138+
for(int h=0; h<height; h++){
139+
String s = this.next();
140+
for(int w=0; w<width; w++){
141+
mat[h][w] = s.charAt(w);
142+
}
143+
}
144+
return mat;
145+
}
146+
}

ContestIO/README.md

Lines changed: 124 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,124 @@
1+
# クラス ContestScanner
2+
3+
競技プログラミングで利用できる入力クラスです.
4+
`java.util.Scanner`等の一般的な入力クラスと比較して高速ですが, ASCII文字以外を入力した際に意図しない動作が発生することがあるので注意してください.
5+
6+
## コンストラクタ
7+
8+
```java
9+
public ContestScanner(java.io.InputStream in)
10+
```
11+
指定された入力ストリームからスキャンされた値を生成する新しいContestScannerを構築します.
12+
13+
```java
14+
public ContestScanner()
15+
```
16+
標準入力からスキャンされた値を生成する新しいContestScannerを構築します.
17+
18+
19+
## メソッド
20+
21+
### hasNext
22+
```java
23+
public boolean hasNext()
24+
```
25+
このスキャナが入力内に別のトークンを保持する場合はtrueを返します.
26+
27+
### next
28+
```java
29+
public String next()
30+
```
31+
このスキャナから次の完全なトークンを検索して返します。
32+
33+
### 数値入力
34+
```java
35+
public int nextInt()
36+
public long nextLong()
37+
public double nextDouble()
38+
```
39+
次のトークンを`int`型/`long`型/`double`型として解釈して返します.
40+
41+
### 配列入力
42+
```java
43+
public long[] nextLongArray(int length)
44+
public int[] nextIntArray(int length)
45+
public double[] nextDoubleArray(int length)
46+
```
47+
`length`個の連続した値を読み取り, 配列として返します.
48+
49+
```java
50+
public long[] nextLongArray(int length, java.util.function.LongUnaryOperator map)
51+
public int[] nextIntArray(int length, java.util.function.IntUnaryOperator map)
52+
public double[] nextDoubleArray(int length, java.util.function.DoubleUnaryOperator map)
53+
```
54+
`length`個の連続した値を読み取り, 各要素に関数`map`を適用したものを配列として返します.
55+
1-indexで与えられた入力を0-indexに変換するなどの用途を想定しています.
56+
57+
### 二次元配列入力
58+
```java
59+
public long[][] nextLongMatrix(int height, int width)
60+
public int[][] nextIntMatrix(int height, int width)
61+
public double[][] nextDoubleMatrix(int height, int width)
62+
```
63+
H行W列に並んだ値を読み取り, 二次元配列として返します.
64+
65+
```java
66+
public char[][] nextCharMatrix(int height, int width)
67+
```
68+
H行W列に並んだ文字を読み取り, 二次元配列として返します.
69+
前述の数値型に関するメソッドと異なり, 各行での空白区切りはないものとしていることに注意してください.
70+
71+
## 使用例
72+
73+
[ABC187 E - Through Path](https://atcoder.jp/contests/abc187/submissions/20257303)
74+
最大100万個の入力, 20万個の出力が必要な問題です.
75+
76+
# クラス ContestPrinter
77+
競技プログラミングで利用できる出力クラスです.
78+
基本的な機能は[`java.io.PrintWriter`](https://docs.oracle.com/javase/jp/8/docs/api/java/io/PrintWriter.html)を利用しています. 自動フラッシュは行われないので, プログラムを終了する前に`flush()``close()`等のメソッドを実行することを忘れないように注意してください.
79+
以下のドキュメントには, [`java.io.PrintWriter`](https://docs.oracle.com/javase/jp/8/docs/api/java/io/PrintWriter.html)との差分のみ記述します.
80+
81+
## コンストラクタ
82+
```java
83+
public ContestPrinter(java.io.PrintStream stream)
84+
public ContestPrinter()
85+
```
86+
指定された出力ストリームから新しいContestPrinterを作成します. 指定を省略した場合は`System.out`が指定されます.
87+
88+
## メソッド
89+
### print(double)
90+
```java
91+
public void print(float f)
92+
public void println(float f)
93+
public void print(double d)
94+
public void println(double d)
95+
```
96+
通常の`printWriter`で浮動小数点数を出力しようとすると, `3.13E-10`のような指数表記になってしまうことがありますが, 本メソッドでは小数点以下20桁まで通常の形式での出力を行います. これにより, 表示形式の不一致による意図しないWAを防ぐことができます.
97+
(多くの問題では「絶対誤差または相対誤差が一定値以下ならAC」というように判定されるため, 正しい計算で得られた値を十分な桁数出力すればACが得られます)
98+
99+
### printArray
100+
```java
101+
public void printArray(int[] array, String separator, java.util.function.IntUnaryOperator map)
102+
public void printArray(int[] array, java.util.function.IntUnaryOperator map)
103+
public void printArray(int[] array, String separator)
104+
public void printArray(int[] array)
105+
106+
public void printArray(long[] array, String separator, java.util.function.LongUnaryOperator map)
107+
public void printArray(long[] array, java.util.function.LongUnaryOperator map)
108+
public void printArray(long[] array, String separator)
109+
public void printArray(long[] array)
110+
111+
public void printArray(double[] array, String separator, java.util.function.DoubleUnaryOperator map)
112+
public void printArray(double[] array, java.util.function.DoubleUnaryOperator map)
113+
public void printArray(double[] array, String separator)
114+
public void printArray(double[] array)
115+
```
116+
`array`の各要素に対して関数`map`を適用し, `separator`区切りで出力します. 行末には`separator`は含まれず, 改行が挿入されます.
117+
`map`及び`separator`は省略可能で, 省略した場合は恒等写像/半角スペースが与えられた場合と同等の出力になります.
118+
119+
`map`は0-indexedの計算結果を1-indexedに変換するような場合に利用するとよいです.
120+
121+
## 使用例
122+
123+
[ABC187 E - Through Path](https://atcoder.jp/contests/abc189/submissions/20258750)
124+
最大100万個の入力, 20万個の出力が必要な問題です.

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424

2525
また, ACL外のアルゴリズムについても必要に応じて実装を進めています.
2626

27+
* [高速入出力](https://github.com/NASU41/AtCoderLibraryForJava/tree/master/ContestIO)
2728
* [Multiset](https://github.com/NASU41/AtCoderLibraryForJava/tree/master/Multiset)
2829

2930
## プログラムを編集したい方へ

0 commit comments

Comments
 (0)