Submission #1204394


Source Code Expand

import math,string,itertools,fractions,heapq,collections,re,array,bisect,sys,random,time,copy

sys.setrecursionlimit(10**7)
inf = 10**20
mod = 10**9 + 7

def LI(): return list(map(int, input().split()))
def II(): return int(input())
def LS(): return input().split()
def S(): return input()


def main():
    start = time.time()
    d = {'R': (0,1), 'L': (0,-1), 'U': (-1,0), 'D': (1,0)}
    dl = list(d.items())
    h,w,k,sr,sc = LI()
    b = []
    o = []
    for _ in range(h):
        s = S()
        b.append([0 if c=='.' else -1 for c in s])
        o.append([0 for _ in s])
    n = II()
    bd = {}
    for _ in range(n):
        r,c,f,g = LI()
        b[r-1][c-1] = f
        o[r-1][c-1] = g
        bd[(r-1,c-1)] = _
    s = ""
    rc = [sr-1,sc-1]
    ii = [2**i for i in range(n)]
    bi = 2**n-1

    ss = [None for _ in range(k)]
    ss[0] = (0,(sr-1,sc-1),bi,'')

    def search(t):
        f = [[False]*w for _ in range(h)]
        s,(i,j),bi,sst = ss[t]
        if bi < 1:
            return t
        q = [(s,i,j)]
        f[i][j] = '-'
        nq = []
        ck = t
        while q:
            s,r,c = q[0]
            for nk, (dr,dc) in dl:
                nr,nc = r+dr, c+dc
                if b[nr][nc] < 0 or f[nr][nc]:
                    continue
                if b[nr][nc] == 0 or not (bi & ii[bd[(nr,nc)]]):
                    nq.append((s,nr,nc,nk))
                    continue
                ns = s + b[nr][nc] - o[nr][nc] * (ck+1)
                if ss[ck+1] and ss[ck+1][0] >= ns:
                    continue

                nb = bi - ii[bd[(nr,nc)]]
                f[nr][nc] = nk
                ct = nk
                mi,mj = nr,nc
                st = ''
                while ct != '-':
                    st = ct + st
                    mi,mj = mi-d[ct][0], mj-d[ct][1]
                    ct = f[mi][mj]
                ss[ck+1] = (ns,(nr,nc),nb,st)
            q = q[1:]
            if not q and ck < k-2:
                ck += 1
                for ns,nr,nc,nk in nq:
                    if f[nr][nc]:
                        continue
                    q.append([ns,nr,nc])
                    f[nr][nc] = nk

        # if t == 0 and False:
        #     print(ss[3])
        #     print('\n'.join(''.join(c if c else '.' for c in fr) for fr in f))
        return t

    mc = 0
    mi = -1
    for ki in range(k):
        if not ss[ki]:
            continue
        if mi+100 < ki:
            break
        if ss[ki][0] > mc:
            mc = ss[ki][0]
            mi = ki
        search(ki)

    sys.stderr.write('\n'.join(map(lambda x: str(x[0]), [c for c in ss[:10] if c])))
    sys.stderr.write('mi: {}, mc: {}\n'.format(mi, mc))

    r = ''
    rd = set()
    while mi > 0:
        r = ss[mi][3] + r
        rd.add(ss[mi][1])
        mi -= len(ss[mi][3])
        # if mi < 10 and False:
        #     sys.stderr.write('mi: {}, mc: {}, ss: {}\n'.format(mi, ss[mi][0], ss[mi][1]))

    def score(r):
        bd = copy.deepcopy(b)
        t = (sr-1,sc-1)
        rc = 0
        for i in range(len(r)):
            c = r[i]
            if c == '-':
                break
            nr,nc = d[c][0] + t[0], d[c][1] + t[1]
            if bd[nr][nc] == -1:
                print('error.', nr,nc,i,c)
                return False
            if bd[nr][nc] > 0:
                rc += bd[nr][nc] - o[nr][nc] * (i+1)
            t = (nr,nc)
        return rc

    # print(score(r))
    print((r + '-'*k)[:k])
    # sys.stderr.write("time:{0} sec\n".format(time.time() - start))

main()

Submission Info

Submission Time
Task B - Food Collector
User iehn
Language PyPy3 (2.4.0)
Score 18928
Code Size 3664 Byte
Status AC
Exec Time 2055 ms
Memory 97368 KB

Judge Result

Set Name test_01 test_02 test_03 test_04 test_05 test_06 test_07 test_08 test_09 test_10
Score / Max Score 1833 / 20000 2551 / 20000 1996 / 20000 1082 / 20000 1969 / 20000 2492 / 20000 1865 / 20000 1617 / 20000 1186 / 20000 2337 / 20000
Status
AC × 1
AC × 1
AC × 1
AC × 1
AC × 1
AC × 1
AC × 1
AC × 1
AC × 1
AC × 1
Set Name Test Cases
test_01 subtask_01_01.txt
test_02 subtask_01_02.txt
test_03 subtask_01_03.txt
test_04 subtask_01_04.txt
test_05 subtask_01_05.txt
test_06 subtask_01_06.txt
test_07 subtask_01_07.txt
test_08 subtask_01_08.txt
test_09 subtask_01_09.txt
test_10 subtask_01_10.txt
Case Name Status Exec Time Memory
subtask_01_01.txt AC 1353 ms 89432 KB
subtask_01_02.txt AC 2040 ms 95832 KB
subtask_01_03.txt AC 1965 ms 97240 KB
subtask_01_04.txt AC 2055 ms 97368 KB
subtask_01_05.txt AC 1684 ms 93272 KB
subtask_01_06.txt AC 1966 ms 93656 KB
subtask_01_07.txt AC 1528 ms 89304 KB
subtask_01_08.txt AC 1712 ms 91428 KB
subtask_01_09.txt AC 1282 ms 86744 KB
subtask_01_10.txt AC 1880 ms 92760 KB