Problem:


Problem B: Cubes Without Holes

There is a cube which consists of n &times; n &times; n small cubes. Small cubes have marks on their surfaces. An example where n = 4 is shown in the following figure.

Then, 
次に、上図（右）に示すように、印のついた表面から、反対の面まで水平または垂直に貫通する穴をあける。

あなたの仕事は、n と 印の位置を読み込み、穴の空いていない小さい立方体の個数を数えるプログラムを作成することである。

Input

入力はいくつかのデータセットからなる。各データセットは以下の形式で与えられる：

n h
c1 a1 b1
c2 a2 b2
   .
   .
   .
ch ah bh

h は印の数を示す整数である。これに続く h 行によって h 個の印の位置が入力される。印の位置を指定するために下図に示す座標軸を用いることにする。(x, y, z) = (1, 1, 1) が左下奥の立方体、(x, y, z) = (n, n, n) が右上手前の立方体を示す。

ci は i 番目の印がつけられている平面を示す文字列である。ci は "xy" 、"xz"、 "yz"　のいづれかであり、それぞれ i 番目の印が xy 平面、xz 平面、 yz 平面上にあることを示す。

ai, bi　は　ci で示された平面上の座標を示す。 xy 平面、xz 平面、yz 平面のとき、ai, bi はそれぞれ平面の座標 (x, y)、(x, z)、(y, z) を示す。例えば、上図において、印 A, B, C の ci, ai, bi の値はそれぞれ、"xy 4 4", "xz 1 2", "yz 2 3" となる。

n, h がともに 0 のとき、入力の終わりを示す。

n ≤ 500, h ≤ 200 と仮定してよい。

Output

各データセットに対して、穴の空いていない立方体の数を１行に出力せよ。

Sample Input

4 3
xy 4 4
xz 1 2
yz 2 3
4 5
xy 1 1
xy 3 3
xz 3 3
yz 2 1
yz 3 3
0 0

Output for the Sample Input

52
46



Sample input:
4 3
xy 4 4
xz 1 2
yz 2 3
4 5
xy 1 1
xy 3 3
xz 3 3
yz 2 1
yz 3 3
0 0


Sample output:
52
46

Submission status: Time Limit Exceeded

Solution code:
# AOJ 1030 Cubes Without Holes
# Python3 2018.7.6 bal4u

import sys
from sys import stdin
input = stdin.readline

while True:
	n, h = map(int, input().split())
	if n == 0: break
	f = [[[0 for k in range(3)] for c in range(500)] for r in range(500)]
	ans = n**3
	for i in range(h):
		c, a, b = input().split()
		a, b = int(a)-1, int(b)-1
		ans -= n
		if c == "xy":
			f[a][b][0] = 1
			ans += sum([(f[a][j][1] | f[a][j][2]) for j in range(n)])
		elif c == "xz":
			f[a][b][1] = 1
			ans += sum([(f[a][j][0] | f[i][b][2]) for j in range(n)])
		else:
			f[a][b][2] = 1
			ans += sum([(f[j][a][0] | f[j][b][1]) for j in range(n)])
	print(ans)

Submission status: Accepted

Solution code:
# AOJ 1030 Cubes Without Holes
# Python3 2018.7.6 bal4u

import sys
from sys import stdin
input = stdin.readline

while True:
	n, h = map(int, input().split())
	if n == 0: break
	ans = []
	for i in range(h):
		c, a, b = input().split()
		a, b = int(a)-1, int(b)-1
		if c == "xy":
			ans += [a+b*n+z*n**2 for z in range(n)]
		elif c == "xz":
			ans += [a+y*n+b*n**2 for y in range(n)]
		else:
			ans += [x+a*n+b*n**2 for x in range(n)]
	print(n**3-len(set(ans)))

Submission status: Accepted

Solution code:
# AOJ 1030 Cubes Without Holes
# Python3 2018.7.6 bal4u

import sys
from sys import stdin
input = stdin.readline

# n <= 500,  2^9 = 512
while True:
	n, h = map(int, input().split())
	if n == 0: break
	ans = []
	for i in range(h):
		c, a, b = input().split()
		a, b = int(a)-1, int(b)-1
		if c == "xy":
			ans += [a+(b<<9)+(z<<18) for z in range(n)]
		elif c == "xz":
			ans += [a+(y<<9)+(b<<18) for y in range(n)]
		else:
			ans += [x+(a<<9)+(b<<18) for x in range(n)]
	print(n**3-len(set(ans)))

Submission status: Accepted

Solution code:
# AOJ 1030 Cubes Without Holes
# Python3 2018.7.6 bal4u

import sys
from sys import stdin
input = stdin.readline

# n <= 500,  2^9 = 512
while True:
	n, h = map(int, input().split())
	if n == 0: break
	ans = []
	for i in range(h):
		s = input()
		c = s[:2]
		a, b = s[3:].split()
		a, b = int(a)-1, int(b)-1
		if c == "xy":
			k = a+(b<<9)
			ans += [k+(z<<18) for z in range(n)]
		elif c == "xz":
			k = a+(b<<18)
			ans += [k+(y<<9) for y in range(n)]
		else:
			k = (a<<9)+(b<<18)
			ans += [k+x for x in range(n)]
	print(n**3-len(set(ans)))

Submission status: Accepted

Solution code:

def hole(query,n):
    dir=query[0]
    [a,b]=[int(x)-1 for x in query[1:]]
    if dir=="xy":
        ret=[b*n+a+z*n**2 for z in range(n)]
    elif dir=="xz":
        ret=[n**2*b+a+y*n for y in range(n)]
    else:
        ret=[n**2*b+a*n+x for x in range(n)]
    return ret


while(1):
    [n,h]=[int(x) for x in raw_input().split()]
    if n==0:
        break
    else:
        bad=[]
        for i in range(h):
            query=raw_input().split()
            bad+=hole(query,n)
        hset=set(bad)
        print n**3-len(hset)

Submission status: Accepted

Solution code:
while 1:
    N, H = map(int, input().split())
    if N == H == 0:
        break
    s = set()
    for i in range(H):
        c, a, b = input().split(); a = int(a)-1; b = int(b)-1
        if c == "xy":
            s.update((a, b, i) for i in range(N))
        if c == "xz":
            s.update((a, i, b) for i in range(N))
        if c == "yz":
            s.update((i, a, b) for i in range(N))
    print(N**3 - len(s))

Submission status: Accepted

Solution code:
def solve():
    while True:
        n, h = map(int, input().split())
        if n == 0:
            break

        s = set()
        for _ in [0]*h:
            t, *a = input().split()
            i, j = map(lambda x: int(x)-1, a)
            k = 1
            if t == "xy":
                j *= n
                k = n**2
            elif t == "xz":
                j *= n**2
                k = n
            else:
                i *= n
                j *= (n**2)

            s.update(range(i+j, i+j+k*n, k))

        print(n**3 - len(s))


if __name__ == "__main__":
    solve()

Submission status: Accepted

Solution code:
while True:
  n, h = map(int, input().split())
  if n == 0:
    break
  hit = set()
  for _ in range(h):
    c, a, b = input().split()
    if c == "xy":
      add = {(int(a), int(b), z) for z in range(1, n + 1)}
    elif c == "xz":
      add = {(int(a), y, int(b)) for y in range(1, n + 1)}
    elif c == "yz":
      add = {(x, int(a), int(b)) for x in range(1, n + 1)}
    hit = hit | add
  print(n ** 3 - len(hit))

Submission status: Accepted

Solution code:
#!/usr/bin/env python

from collections import deque
import itertools as it
import sys
import math

sys.setrecursionlimit(10000000)

while True:
    n, h = map(int, raw_input().split())
    if n == 0:
        break
    m = {}
    for loop in range(h):
        S, p1, p2 = raw_input().split()
        p1 = int(p1)
        p2 = int(p2)
        for i in range(1, n + 1):
            if S == 'xy':
                m[(p1, p2, i)] = 1
            if S == 'xz':
                m[(p1, i, p2)] = 1
            if S == 'yz':
                m[(i, p1, p2)] = 1
    print n ** 3 - len(m)