본문 바로가기

CP Algorithm & Knowledge

C++ fast io 코드

728x90
728x90

PS 혹은 CP를 하다 보면 이론상 통과가 힘든 시간 복잡도이지만 그럼에도 불구하고 시도를 하고 싶을 때 대표적으로 IO 오버헤드를 최대한으로 줄이는 방법을 채택한다.

 

이 포스트에서는 버퍼같은 이론적 배경은 접어두고 즉시 사용할 수 있는 코드를 제공하고자 한다.

 

첨부한 코드는 USACO GUIDE에 수록된 코드를 일부 개조했으며 리눅스 환경이 아닌 곳에서도 바로 사용할 수 있다.

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
inline namespace Input {
  const int BUF_SZ = 1 << 17;
  char buf[BUF_SZ];
  int pos;
  int len;
  char next_char() {
    if (pos == len) {
      pos = 0;
      len = (int)fread(buf, 1, BUF_SZ, stdin);
      if (!len) {
        return EOF;
      }
    }
    return buf[pos++];
  }
 
  // change to long long if you need
  int read_int() {
    int x;
    char ch;
    int sgn = 1;
    while (!isdigit(ch = next_char())) {
      if (ch == '-') {
        sgn *= -1;
      }
    }
    x = ch - '0';
    while (isdigit(ch = next_char())) {
      x = x * 10 + (ch - '0');
    }
    return x * sgn;
  }
  
  string read_string() {
    string ret;
    char ch;
    while (isspace(ch = next_char())) {}
    ret.push_back(ch);
    while (not isspace(ch = next_char()))
      ret.push_back(ch);
    return ret;
  }
// namespace Input
 
inline namespace Output {
  const int BUF_SZ = 1 << 17;
  char buf[BUF_SZ];
  int pos;
 
  void flush_out() {
    fwrite(buf, 1, pos, stdout);
    pos = 0;
  }
 
  void write_char(char c) {
    if (pos == BUF_SZ) {
      flush_out();
    }
    buf[pos++= c;
  }
 
  void write_int(long long x, char delim = '\n') {
    static char num_buf[100];
    if (x < 0) {
      write_char('-');
      x *= -1;
    }
    int len = 0;
    for (; x >= 10; x /= 10) {
      num_buf[len++= (char)('0' + (x % 10));
    }
    write_char((char)('0' + x));
    while (len) {
      write_char(num_buf[--len]);
    }
    write_char(delim);
  }
 
  // auto-flush output when program exits
  void init_output() { assert(atexit(flush_out) == 0); }
// namespace Output
cs

 

fast io의 위력은 대충 N이 100만을 넘어갈 때 유효하다.

 

196ms 제출이 cpp에서 싱크 해제한 한 코드이고 104ms 제출이 위 코드로 입력을 받은 코드이다. 100만 기준 대략 100ms 정도의 이득을 볼 수 있으므로 대회 상황에서는 AC를 받는데 충분한 도움이 될 수 있다.

728x90
728x90