結果

問題 No.5019 Hakai Project
ユーザー とろちゃ
提出日時 2023-11-17 18:59:05
言語 PyPy3
(7.3.15)
結果
AC  
実行時間 134 ms / 3,000 ms
コード長 3,203 bytes
コンパイル時間 297 ms
コンパイル使用メモリ 81,700 KB
実行使用メモリ 80,204 KB
スコア 54,275,855
最終ジャッジ日時 2023-11-17 18:59:18
合計ジャッジ時間 10,908 ms
ジャッジサーバーID
(参考情報)
judge14 / judge13
純コード判定しない問題か言語
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
other AC * 50
権限があれば一括ダウンロードができます

ソースコード

diff #
プレゼンテーションモードにする

# import pypyjit;pypyjit.set_param("max_unroll_recursion=-1")
import os
import sys
# from bisect import *
from collections import *
# from datetime import *
# from decimal import * # PyPy
# from heapq import *
# from itertools import *
# from math import gcd, lcm
# from random import *
# from string import *
# import numpy as np
# from atcoder.dsu import *
# from atcoder.segtree import *
# from more_itertools import *
# from sortedcontainers import *
# sys.setrecursionlimit(10**7) # PyPy
# sys.set_int_max_str_digits(0)
INF = 1 << 61
MOD = 998244353
# MOD = 10**9 + 7
IS_ATCODER = os.getenv("ATCODER", 0)
File = sys.stdin
def input():
return File.readline()[:-1]
# ///////////////////////////////////////////////////////////////////////////
def move(p1):
global ans, haruku
haruku = list(haruku)
y2, x2 = p1
while haruku[1] != x2:
if haruku[1] < x2:
ans.append([1, "R"])
haruku[1] += 1
else:
ans.append([1, "L"])
haruku[1] -= 1
while haruku[0] != y2:
if haruku[0] < y2:
ans.append([1, "D"])
haruku[0] += 1
else:
ans.append([1, "U"])
haruku[0] -= 1
haruku = tuple(haruku)
def calc_dist(p1, p2):
return abs(p1[0] - p2[0]) + abs(p1[1] - p2[1])
def buy_bomb(p1):
nxt = (INF, INF)
for i in shop:
dist = calc_dist(p1, i)
if calc_dist(p1, nxt) > dist:
nxt = i
move(nxt)
# print(A[haruku[0]][haruku[1]])
for _ in range(50):
for b in bomb[use][2]:
ans.append([2, b])
N, M = map(int, input().split())
A = [list(input()) for _ in range(N)]
bomb = []
for i in range(M):
C, L = map(int, input().split())
bomb.append([C, set([tuple(map(int, input().split())) for _ in range(L)]), [i + 1]])
for i in range(M):
for j in range(i + 1, M):
bomb.append(
[bomb[i][0] + bomb[j][0], bomb[i][1] | bomb[j][1], bomb[i][2] + bomb[j][2]]
)
shop = set()
building = set()
for i in range(N):
for j in range(N):
if A[i][j] == "@":
shop.add((i, j))
elif A[i][j] == "#":
building.add((i, j))
# bomb.sort(key=lambda x:x[1]/x[0],reverse=True)
mn = INF
for i in range(len(bomb)):
if bomb[i][0] > mn:
continue
s1 = set()
s2 = set()
for j, k in bomb[i][1]:
if k >= 0:
s1.add(j)
if k <= 0:
s2.add(j)
if len(s1) == 41 and len(s2) == 41:
use = i
mn = bomb[i][0]
ans = deque()
haruku = (0, 0)
for start in [(20, 0), (40, 0)]:
buy_bomb(haruku)
move(start)
for k in range(50):
for b in bomb[use][2]:
ans.append([3, b])
for i, j in bomb[use][1]:
shop.discard((haruku[0] + i, haruku[1] + j))
try:
A[haruku[0] + i][haruku[1] + j] = "."
except IndexError:
pass
if k == 49:
break
ans.append([1, "R"])
haruku = (haruku[0], haruku[1] + 1)
# print(haruku)
# for i in A:
# print("".join(i))
print(len(ans))
for i in ans:
print(*i)
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
0