🐥
AtCoder Beginner Contest 213
A - Bitwise Exclusive Or
import sys
import heapq, math
from collections import defaultdict, deque
from bisect import bisect_left, bisect_right
inputs = sys.stdin.readline
mod = 10**9+7
inf = float('inf')
#sys.setrecursionlimit(10**7)
def main():
a,b = map(int, inputs().split())
for c in range(0, 256):
if a^c==b:
print(c)
exit()
if __name__ == '__main__':
main()
cの範囲が狭いので、この範囲で全探索すれば十分
B - Booby Prize
import sys
import heapq, math
from collections import defaultdict, deque
from bisect import bisect_left, bisect_right
inputs = sys.stdin.readline
mod = 10**9+7
inf = float('inf')
#sys.setrecursionlimit(10**7)
def main():
n = int(input())
a = list(map(int, inputs().split()))
d = {e+1:x for e,x in enumerate(a)}
d = sorted(d.items(), key=lambda x:x[1], reverse=True)
print(d[1][0])
if __name__ == '__main__':
main()
ソートした後2番目のスコアを参照する
C - Reorder Cards
import sys
import heapq, math
from collections import defaultdict, deque
from bisect import bisect_left, bisect_right
inputs = sys.stdin.readline
mod = 10**9+7
inf = float('inf')
#sys.setrecursionlimit(10**7)
def main():
h,w,n = map(int, inputs().split())
idx, y, x = [], [], []
for _ in range(n):
a,b = map(int, inputs().split())
y.append(a)
x.append(b)
idx.append((a,b))
x = sorted(list(set(x)))
y = sorted(list(set(y)))
dx,dy = {xx:e+1 for e,xx in enumerate(x)}, {yy:e+1 for e,yy in enumerate(y)}
for (a,b) in idx:
print(dy[a], dx[b])
if __name__ == '__main__':
main()
座標圧縮を行う。行・列ともに{座標:何番目か}のインデックスを持つ
同じ座標を消去した後に順番を決めることに注意
D - Takahashi Tour
import sys
import heapq, math
from collections import defaultdict, deque
from bisect import bisect_left, bisect_right
inputs = sys.stdin.readline
mod = 10**9+7
inf = float('inf')
sys.setrecursionlimit(10**7)
ans = []
def main():
def dfs(pos, pre):
ans.append(pos)
for nx in v[pos]:
if nx!=pre:
dfs(nx, pos)
ans.append(pos)
n = int(input())
v = [[] for _ in range(n+1)]
for _ in range(n-1):
a,b = map(int, inputs().split())
v[a].append(b)
v[b].append(a)
for x in v:
x.sort()
dfs(1,-1)
print(*ans)
if __name__ == '__main__':
main()
dfsによるオイラーツアーを行う。
再帰なのでsys.setrecursionlimit(10**7)を忘れずに設定する
E - Stronger Takahashi
import sys
import heapq, math
from collections import defaultdict, deque
from bisect import bisect_left, bisect_right
inputs = sys.stdin.readline
mod = 10**9+7
inf = float('inf')
#sys.setrecursionlimit(10**7)
def main():
h,w = map(int, inputs().split())
g = [list(input()) for _ in range(h)]
cnt = [[inf]*w for _ in range(h)]
que = deque([(0,0,0)])
ng = set([(i,j) for i,j in zip([-2,-2,2,2],[-2,2,-2,2])])
while que:
y,x,c = que.popleft()
if cnt[y][x]<c:
continue
for i,j in ((1,0),(0,1),(-1,0),(0,-1)):
ny,nx = y+i, x+j
if 0<=ny<h and 0<=nx<w:
if g[ny][nx]!='#':
if c<cnt[ny][nx]:
cnt[ny][nx] = c
que.appendleft((ny,nx,c))
for i in range(-2, 3):
for j in range(-2, 3):
if (i,j) not in ng:
ny,nx = y+i,x+j
if 0<=ny<h and 0<=nx<w:
if c+1<cnt[ny][nx]:
cnt[ny][nx] = c+1
que.append((ny,nx,c+1))
print(cnt[-1][-1])
if __name__ == '__main__':
main()
考える移動は以下の2通り
- 道を伝う場合
- 左右上下のマスへの移動
- 移動にかかるコストは0
- パンチを行う場合
- 四隅を除いた上下左右へ2マスの範囲内へ移動可能となる
- 移動にかかるコストは1
道を伝う場合の方がコストは小さいので、appendleftによる枝刈りを行う
参考記事
Discussion