forked from abeaumont/competitive-programming
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathd.pi
78 lines (76 loc) · 2.12 KB
/
d.pi
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
% https://codingcompetitions.withgoogle.com/codejam/round/00000000002017f7/00000000002017f8
import util, mip.
go(N, T, X1, X2, X3) =>
Board0 = new_array(N, N),
Board1 = new_array(N, N),
Board2 = new_array(N, N),
Board3 = new_array(N, N),
Board0 :: 0..1,
Board1 :: 0..1,
Board2 :: 0..1,
Board3 :: 0..1,
foreach((I, J) in X1)
Board0[I, J] #= 0,
Board2[I, J] #= 0
end,
foreach((I, J) in X2)
Board0[I, J] #= 0,
Board1[I, J] #= 0
end,
foreach((I, J) in X3)
Board0[I, J] #= 0,
Board1[I, J] #= 0,
Board2[I, J] #= 0,
Board3[I, J] #= 1
end,
foreach(I in 1..N, J in 1..N)
Board0[I, J] + Board1[I, J] + Board2[I, J] + Board3[I, J] #= 1
end,
foreach(I in 1..N)
sum([Board2[I, J] + Board3[I, J] : J in 1..N]) #<= 1,
sum([Board2[J, I] + Board3[J, I] : J in 1..N]) #<= 1,
end,
foreach(K in 2..2*N)
sum([Board1[I, J] + Board3[I, J] : I in 1..N, J in 1..N, I + J = K]) #<= 1
end,
foreach(K in -(N-1)..N-1)
sum([Board1[I, J] + Board3[I, J] : I in 1..N, J in 1..N, I - J = K]) #<= 1
end,
Sum #= sum([Board1[I, J] + Board2[I, J] + Board3[I, J] * 2 : I in 1..N, J in 1..N]),
solve([$max(Sum)], [Board0, Board1, Board2, Board3]),
X = [],
[S1, S2, S3] = [new_set(X1), new_set(X2), new_set(X3)],
foreach(I in 1..N, J in 1..N)
if Board1[I, J] == 1, not S1.has_key((I, J)) then
X := [to_fstring("+ %d %d", I, J)| X]
elseif Board2[I, J] == 1, not S2.has_key((I, J)) then
X := [to_fstring("x %d %d", I, J)| X]
elseif Board3[I, J] == 1, not S3.has_key((I, J)) then
X := [to_fstring("o %d %d", I, J)| X]
end,
end,
printf(stderr, "Case #%d: %d %d\n", T, Sum, X.length),
foreach (S in X)
println(stderr, S)
end.
main() =>
T = read_number(),
foreach(I in 1..T)
X1 = [],
X2 = [],
X3 = [],
[N, M] = [read_number() : J in 1..2],
foreach(J in 1..M)
[A, Y, X] = readln().split(),
Y := Y.to_number(),
X := X.to_number(),
if A == "+" then
X1 := [(Y, X)|X1]
elseif A == "x" then
X2 := [(Y, X)|X2]
else
X3 := [(Y, X)|X3]
end,
end,
go(N, I, X1, X2, X3)
end.