-
Notifications
You must be signed in to change notification settings - Fork 0
/
main.go
149 lines (123 loc) · 2.55 KB
/
main.go
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
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
package main
import (
"bufio"
"fmt"
"math"
"math/bits"
"os"
"strconv"
"strings"
)
func main() {
a := nextInt()
b := nextInt()
c := nextInt()
d := nextInt()
fmt.Println(a*d - b*c)
}
// ==================================================
// 入力操作
// ==================================================
var stdin = initStdin()
func initStdin() *bufio.Scanner {
bufsize := 1 * 1024 * 1024 // 1 MB
var stdin = bufio.NewScanner(os.Stdin)
stdin.Buffer(make([]byte, bufsize), bufsize)
stdin.Split(bufio.ScanWords)
return stdin
}
func nextString() string {
stdin.Scan()
return stdin.Text()
}
// 遅いから極力使わない。
func nextBytes() []byte {
return []byte(nextString())
}
func nextInt() int {
i, _ := strconv.Atoi(nextString())
return i
}
func nextInts(n int) []int {
a := make([]int, n)
for i := 0; i < n; i++ {
a[i] = nextInt()
}
return a
}
func toi(b byte) int {
return int(b - '0')
}
func nextLongIntAsArray() []int {
s := nextString()
l := len(s)
arr := make([]int, l)
for i := 0; i < l; i++ {
arr[i] = toi(s[i])
}
return arr
}
// ==================================================
// 数値操作
// ==================================================
func max(a, b int) int {
if a > b {
return a
}
return b
}
func min(a, b int) int {
if a < b {
return a
}
return b
}
func abs(a int) int {
if a > 0 {
return a
}
return -a
}
func pow(a, b int) int {
return int(math.Pow(float64(a), float64(b)))
}
// binarysearch は judgeがtrueを返す最小の数値を返します。
func binarysearch(ok, ng int, judge func(int) bool) int {
for abs(ok-ng) > 1 {
mid := (ok + ng) / 2
if judge(mid) {
ok = mid
} else {
ng = mid
}
}
return ok
}
// ==================================================
// ビット操作
// ==================================================
// nthbit はaのn番目のビットを返します。
func nthbit(a int, n int) int { return int((a >> uint(n)) & 1) }
// popcount はaのうち立っているビットを数えて返します。
func popcount(a int) int {
return bits.OnesCount(uint(a))
}
// ==================================================
// 文字列操作
// ==================================================
func toLowerCase(s string) string {
return strings.ToLower(s)
}
func toUpperCase(s string) string {
return strings.ToUpper(s)
}
// ==================================================
// 構造体
// ==================================================
type point struct {
x int
y int
}
func debug(args ...interface{}) {
fmt.Fprintln(os.Stderr, args...)
}